मुझे कोई समस्या है और उम्मीद है कि कोई जानता है कि क्या गलत हो रहा है और मुझे यह बताएं कि मैं इस चीज़ को काम करने के लिए अभी क्या खो रहा हूं सुझाव दिया।स्विंग प्रश्न/जेटीआर/कस्टम पेड़ मॉडल
मेरे पास एक जेट्री है जो एक कस्टम ट्रीमोडेल ("डब्लूआरटीएम मॉडल", नीचे देखें) पर आधारित है। इस मॉडल का डेटा संरचना एक रूट ऑब्जेक्ट का निर्माण करने के लिए उपयोग की जाएगी जिसमें कुछ फ़ील्ड शामिल हैं और इसके अलावा नीचे दी गई "ArrayListModel" द्वारा समर्थित एक सूची है। जब मैं इसे WRTreeModel का उपयोग कर बनाता हूं तो पेड़ ठीक दिखता है। मैं नोड्स को विस्तार और पतन करने में सक्षम हूं जो वस्तुओं में निहित सूचियों और फ़ील्ड का प्रतिनिधित्व करते हैं। मैं इन सूचियों का विस्तार और पतन कर सकता हूं और उनकी सामग्री को भी देख सकता हूं।
अब मैं सूचियों में से किसी एक बच्चे को हटाना चाहता हूं - जैसा कि मुझे पहले से ही पता है - इसे ArrayListModel की निकालने विधि को कॉल करने वाले मॉडल से इसे हटाकर करें। WRTreeModel को उस निकालने के बारे में जागरूक करने के लिए, पहली बात यह है कि उसकी आग को कॉल करना अंतराल हटाया गया तरीका कहा जाता है, अब तक इतना अच्छा है।
WRTreeModels में भीतरी वर्ग ArrayModelListener intervalRemoved विधि fireTreeNodesRemoved की कॉल जो फिर एक TreeEvent जो सभी पंजीकृत TreeModelListeners को भेजा जाता है बनाता है तैयार करता है (और इसलिए JTree जो अपने आप automaticall जब यह मॉडल से कनेक्ट होने पर पंजीकृत करता है)।
अब मैं उम्मीद करता हूं कि पेड़ परिवर्तन को प्रतिबिंबित करता है और नए राज्य को दिखाने के लिए आंतरिक और दृश्य प्रतिनिधित्व को अद्यतन करता है। दुर्भाग्यवश ऐसा लगता है कि ऐसा नहीं लगता है। कुछ हुआ है। लेकिन जब मैं नोड पर क्लिक करता हूं तो मैंने कुछ इवेंट हैंडलर-अपवादों को फेंक दिया है। स्पष्ट रूप से कुछ वास्तव में भ्रमित हो गया।
मुझे पता है कि फ्लाई पर ऐसे प्रश्न का उत्तर देना आसान नहीं है लेकिन मैं वास्तव में तेज़ उत्तर की सराहना करता हूं। यदि कोई कस्टम पेड़ मॉडल (डिफ़ॉल्ट डिटटेबल ट्रीनोड या किसी भी दिए गए कार्यान्वयन आधारित वर्ग पर नहीं) और ईवेंट जेड्री कार्यों के संचालन और अद्यतन के उपयोग की व्याख्या करने वाली वेबसाइटों को जानता है, तो यह भी मददगार होगा।
साथ सादर,
थॉमस कला
public class ArrayListModel<E> extends ArrayList<E> implements ListModel {
...
public E remove(int index) {
fireIntervalRemoved(index, index);
E removedElement = super.remove(index);
return removedElement;
}
...
}
public class WRTreeModel extends LogAndMark implements TreeModel {
class ArrayModelListener implements ListDataListener {
...
@Override
public void intervalRemoved(ListDataEvent e) {
int[] indices = new int[e.getIndex1() - e.getIndex0() + 1];
for (int i = e.getIndex0(); i < e.getIndex1(); i++)
indices[i - e.getIndex0()] = i;
fireTreeNodesRemoved(e.getSource(), getPathToRoot(e.getSource()), indices, ((ArrayListModel<?>)e.getSource()).subList(e.getIndex0(), e.getIndex1()+1).toArray());
}
...
}
public Object[] getPathToRoot(Object child) {
ArrayList<Object> ret = new ArrayList<Object>();
if (child == null)
return ret.toArray();
ret.add(root);
if (child == root)
return ret.toArray();
int childType = 0;
if (child instanceof List<?> && ((List) child).get(0) instanceof Einleitungsstelle) {
childType = 1;
}
if (child instanceof Einleitungsstelle) {
childType = 2;
}
if (child instanceof List<?> && ((List) child).get(0) instanceof Messstelle) {
childType = 3;
}
if (child instanceof Messstelle) {
childType = 4;
}
if (child instanceof List<?> && ((List) child).get(0) instanceof Ueberwachungswert) {
childType = 5;
}
if (child instanceof Ueberwachungswert) {
childType = 6;
}
if (child instanceof List<?> && ((List) child).get(0) instanceof Selbstueberwachungswert) {
childType = 7;
}
if (child instanceof Selbstueberwachungswert) {
childType = 8;
}
switch (childType) {
// List of ESTs
case 1: {
ret.add(child);
break;
}
// EST
case 2: {
List<Einleitungsstelle> listOfEST = ((Wasserrecht) (root)).getListOfEST();
ret.add(listOfEST);
ret.add(child);
break;
}
// List of MSTs
case 3: {
List<Einleitungsstelle> listOfEST = ((Wasserrecht) (root)).getListOfEST();
ret.add(listOfEST);
// Find the EST containing the List of MSTs the child referes to
for (Einleitungsstelle einleitungsstelle : listOfEST) {
if (child == einleitungsstelle.getListOfMST()) {
ret.add(einleitungsstelle);
break;
}
}
ret.add(child);
break;
}
// MST
case 4: {
List<Einleitungsstelle> listOfEST = ((Wasserrecht) (root)).getListOfEST();
ret.add(listOfEST);
// Find the EST containing the List of MSTs the child referes to
for (Einleitungsstelle einleitungsstelle : listOfEST) {
if (child == einleitungsstelle.getListOfMST()) {
ret.add(einleitungsstelle.getListOfMST());
break;
}
}
ret.add(child);
break;
}
// List of UEWs
case 5: {
List<Einleitungsstelle> listOfEST = ((Wasserrecht) (root)).getListOfEST();
ret.add(listOfEST);
// Find the EST containing the List of MSTs the child referes to
for (Einleitungsstelle einleitungsstelle : listOfEST) {
ArrayListModel<Messstelle> listOfMST = einleitungsstelle.getListOfMST();
if (child == listOfMST) {
ret.add(listOfMST);
for (Messstelle messstelle : listOfMST) {
if (child == messstelle.getListOfUEW()) {
ret.add(messstelle.getListOfUEW());
break;
}
}
break;
}
}
break;
}
// UEW
case 6: {
List<Einleitungsstelle> listOfEST = ((Wasserrecht) (root)).getListOfEST();
ret.add(listOfEST);
// Find the EST containing the List of MSTs the child referes to
for (Einleitungsstelle einleitungsstelle : listOfEST) {
ArrayListModel<Messstelle> listOfMST = einleitungsstelle.getListOfMST();
if (child == listOfMST) {
ret.add(listOfMST);
for (Messstelle messstelle : listOfMST) {
if (child == messstelle.getListOfUEW()) {
ret.add(messstelle.getListOfUEW());
break;
}
}
break;
}
}
ret.add(child);
break;
}
// List of SUEWs
case 7: {
List<Einleitungsstelle> listOfEST = ((Wasserrecht) (root)).getListOfEST();
ret.add(listOfEST);
// Find the EST containing the List of MSTs the child referes to
for (Einleitungsstelle einleitungsstelle : listOfEST) {
ArrayListModel<Messstelle> listOfMST = einleitungsstelle.getListOfMST();
if (child == listOfMST) {
ret.add(listOfMST);
for (Messstelle messstelle : listOfMST) {
if (child == messstelle.getListOfSUEW()) {
ret.add(messstelle.getListOfSUEW());
break;
}
}
break;
}
}
break;
}
// SUEW
case 8: {
List<Einleitungsstelle> listOfEST = ((Wasserrecht) (root)).getListOfEST();
ret.add(listOfEST);
// Find the EST containing the List of MSTs the child referes to
for (Einleitungsstelle einleitungsstelle : listOfEST) {
ArrayListModel<Messstelle> listOfMST = einleitungsstelle.getListOfMST();
if (child == listOfMST) {
ret.add(listOfMST);
for (Messstelle messstelle : listOfMST) {
if (child == messstelle.getListOfSUEW()) {
ret.add(messstelle.getListOfSUEW());
break;
}
}
break;
}
}
ret.add(child);
break;
}
default:
ret = null;
}
return ret.toArray();
}
}
...
protected void fireTreeNodesRemoved(Object changed, Object path[], int childIndecies[], Object children[]) {
TreeModelEvent event = new TreeModelEvent(this, path, childIndecies, children);
synchronized (listeners) {
for (Enumeration e = listeners.elements(); e.hasMoreElements();) {
TreeModelListener tml = (TreeModelListener) e.nextElement();
tml.treeNodesRemoved(event);
}
}
}
...
}
पता नहीं है कि यह और मदद की है, लेकिन जब मैं पतन करने की कोशिश करता हूं और फिर हटाए गए नोड के पैरेंट नोड का विस्तार करता हूं तो मुझे निम्न अपवाद मिलता है: थ्रेड में अपवाद "एडब्ल्यूटी-इवेंट क्यूयू -0" java.lang। NullPointerException \t javax.swing.plaf.basic.BasicTreeUI.ensureRowsAreVisible (BasicTreeUI.java:1881) \t पर javax.swing.plaf.basic.BasicTreeUI.toggleExpandState पर (BasicTreeUI.java:2208) \t javax.swing पर। plaf.basic.BasicTreeUI.handleExpandControlClick (BasicTreeUI.java:2191) \t javax.swing.plaf.basic.BasicTreeUI.checkForClickInExpandControl पर (BasicTreeUI.java:2149) \t पर ... और –
पर सभी समस्याएं परिभाषा से जरूरी हैं :-) मैं एक प्रश्न में "समय दबाव" का उल्लेख नहीं करता। और आपका प्रश्न रहने और दूसरों की मदद करने के लिए है जब आप इसके बारे में लंबे समय से भूल गए हैं। यह और अधिक canonical बनाता है। – raoulsson