Hierarchie bei verschachtelten JListen?
-
Hallo, will 3 JList's erstellen und diese dann verschachteln.
Also:
in JList 1 auswählen,
JList 2 zeigt in Abhängigkeit zu dieser etwas an,
und JList 3 in Abhängigkeit von der 2.habe dazu folgenden Sourecode geschrieben:
// Die Tabellen mit ihren Modellen final JList profile = new JList(); final DefaultListModel profilmodel = new DefaultListModel(); // Gibt nur an wieviele Einträge selectiert werden dürfen profile.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); final JList referenzen = new JList(); final DefaultListModel referenzmodel = new DefaultListModel(); referenzen.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); final JList messreihen = new JList(); final DefaultListModel messreihenmodel = new DefaultListModel(); messreihen.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); // Für Tabelle Profile // TabellenModell mit Werten aus der Datenbank füllen // Das Objekt db ist eine Datenbankklassenobjekt // db.getProfilCount() gibt nur eine Summe zurück for (int i = 0; i<db.getProfilCount();i++) { db.getProfile(); String Indexp = ""; Indexp += db.p_Index; profilmodel.addElement(Indexp); } // Festlegung des Models für das View Objekt, nämlich profile als JList profile.setModel(profilmodel); referenzen.setModel(referenzmodel); messreihen.setModel(messreihenmodel); // Ein SelectionsListener auf die Tabelle Profile profile.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { // Konvertierung von String nach int. // Hier wird der Wert des Indexes der Tabelle Profile nach int konvertiert. int pindex = Integer.parseInt((String) profilmodel.get(profile.getSelectedIndex())); // Das Modelle erstmal gecleart messreihenmodel.clear(); referenzmodel.clear(); //referenzen.clearSelection(); //messreihen.clearSelection(); db.initControl(); for (int i = 0; i<db.getReferenzbyProfilIndexCount(pindex);i++) { db.getReferenzbyProfilIndex(pindex); String Indexr = ""; Indexr += db.r_Referenzschluessel; referenzmodel.addElement(Indexr); } } }); referenzen.addListSelectionListener(new ListSelectionListener() { public void valueChanged(ListSelectionEvent arg0) { messreihenmodel.clear(); db.initControl(); for (int i = 0; i<db.getShowMessreiheCount(referenzmodel.get(referenzen.getSelectedIndex()).toString());i++) { db.ShowMessreihen(referenzmodel.get(referenzen.getSelectedIndex()).toString()); String Indexr = ""; Indexr += db.sm_Messreihe; messreihenmodel.addElement(Indexr); } } });
Mein Problem ist jetzt, mit 2 JList's klappt alles Klasse, nur mit 3 JList
kriege ich ein Problem wenn ich die 1. wieder auswählen und dann die anderen
beiden wieder "gecleart" werden. Dann wird eine Exception geworfen.Hat jemand von euch eine Idee??
-Gruß Patrick
-
Wie lautet denn die Exception und in welcher Zeile tritt sie auf?
-
sorry für die späte Antwort
folge Exception kommt:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 at java.util.Vector.elementAt(Unknown Source) at javax.swing.DefaultListModel.get(Unknown Source) at Datensatzfenster$2.valueChanged(datensaetze.java:172) at javax.swing.JList.fireSelectionValueChanged(Unknown Source) at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.removeIndexInterval(Unknown Source) at javax.swing.plaf.basic.BasicListUI$Handler.intervalRemoved(Unknown Source) at javax.swing.AbstractListModel.fireIntervalRemoved(Unknown Source) at javax.swing.DefaultListModel.clear(Unknown Source) at Datensatzfenster$1.valueChanged(datensaetze.java:154) at javax.swing.JList.fireSelectionValueChanged(Unknown Source) at javax.swing.JList$ListSelectionHandler.valueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.fireValueChanged(Unknown Source) at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) at javax.swing.DefaultListSelectionModel.changeSelection(Unknown Source) at javax.swing.DefaultListSelectionModel.setSelectionInterval(Unknown Source) at javax.swing.JList.setSelectionInterval(Unknown Source) at javax.swing.plaf.basic.BasicListUI$Handler.adjustFocusAndSelection(Unknown Source) at javax.swing.plaf.basic.BasicListUI$Handler.mousePressed(Unknown Source) at java.awt.AWTEventMulticaster.mousePressed(Unknown Source) at java.awt.Component.processMouseEvent(Unknown Source) at javax.swing.JComponent.processMouseEvent(Unknown Source) at java.awt.Component.processEvent(Unknown Source) at java.awt.Container.processEvent(Unknown Source) at java.awt.Component.dispatchEventImpl(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) at java.awt.Container.dispatchEventImpl(Unknown Source) at java.awt.Window.dispatchEventImpl(Unknown Source) at java.awt.Component.dispatchEvent(Unknown Source) at java.awt.EventQueue.dispatchEvent(Unknown Source) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.pumpEvents(Unknown Source) at java.awt.EventDispatchThread.run(Unknown Source)
-
Das List Selection event wird auch geworfen wenn sich die Liste ändert. Aktualiert du jetzt die 2. Liste dann wird ein Selection event der 2. geworfen. Das must du abfangen.
Ich hatte mal das selbe Ploblem mit 3 Combos.
public void onSelectLinie(ItemEvent e) { //Wechselt die Beschriftung für Modul/Station für die Linie 121 String linie = e.getItem().toString(); int linienNr = Integer.parseInt(linie); /****************************************************************/ cmbStation.removeAllItems(); CStation stationNames[] =app.getDatabaseCtrl().getStations((CLinie)e.getItem()); for ( int i = 0; i < stationNames.length ; i++ ) cmbStation.addItem(stationNames[i]); } public void onSelectStation(ItemEvent e) { cmbModul.removeAllItems(); CModul modulNames[] = app.getDatabaseCtrl().getModuls((CStation)e.getItem()); for ( int i = 0; i < modulNames.length ; i++ ) cmbModul.addItem(modulNames[i]); } public void onSelectModul(ItemEvent e) { }
Dabei ist ist es so :
3 Combos . Der SelectionListener ruft jeweils die obigen on select methoden auf.
1. Linie -> Der Inhalt ändert sich nie
2. Station -> Inhalt ändert sich beim Event auf Linie
3. Modul -> Inhalt ändert sich bei Event auf StationDie Methode löscht jeweils den Inhalt des nächsten Combos in der Hirarchie und füllt diesen wieder. Den Listener für das 3. Combo in der Hirarchie kannst du dir dann eigentlich auch sparen.
-
danke!!!
ich habe es so gelöst:
referenzen.getSelectedIndex(); // gibt int zurück.
der hat immer ne -1 zurückgegeben, was zum Fehler geführt hat!
-
Jau genau. Weil beim füllen der Liste das Selection Event aufgerufen wird. Wenn dann noch nix drinn ist also bei ersten Element dann wirds -1.
So ist glaub oder ?
-
ja, auch. Aber bei mir war es so, dass beim "clearen" der Jlist der Selection
Listener aufgerufen wurden. Ist mir erst beim debuggen aufgefallen. tja,
das habe ich dann abgefangen und konnte drauf reagieren!