JList update über tabbedPane?

Status
Nicht offen für weitere Antworten.

chucknorris

Mitglied
Moin,

Folgende Konstruktion:

Tab1:
Hier sind Formularfelder (JTextfield), mit denen Daten in eine MySQL-Datenbank gespeichert werden.​

Tab2:
Hier ist eine JList, die die bereits gespeicherten Daten anzeigt.​

Problem:
Wenn ich in Tab1 Daten eingebe und gleich danach (noch zur Laufzeit) auf Tab2 wechsle, dann zeigt die JList den neuen Eintrag NICHT an. Ich muss dazu das ganze Programm neu starten, damit es wirksam wird.​

Wie kann ich es bewirken, dass die JList zur Laufzeit die Daten refresht?

ich habe schon einiges probiert:

- revalidate()
- repaint()
- tabbedPane.changelistener()

nichts funktioniert. Irgendwelche Ideen?

So sieht meine JList aus:

Java:
final DefaultListModel listModel = new DefaultListModel();
		ConnectMySQL db = ConnectMySQL.getInstance();
		ResultSet rs = db.query("SELECT * FROM Tab ORDER BY 'ID'");
		         while (rs.next()) { 
		        	 listModel.addElement( rs.getString("id") + ": " + rs.getString("name") );
		         }
		final JList WaehlerListe = new JList(listModel);

Die Liste bekommt ihre Daten durch eine MySQL-Abfrage.
Wenn ich in Tab1 etwas speichere muss irgendwas passieren, damit hier aktuelle Daten erscheinen, nur weiss ich nicht was und wie...Ich glaube das ganze hängt auch irgendwie mit der JTabbedPane zusammen...Könnte man das ganze evtl. auch mit einem Pattern lösen?

Edit: Die JList (verknüpft mit einem JScrollPane) liegt auf einem separaten JPanel. Ich meine gehört zu haben, dass es auch damit Probleme gibt

Ich würde es sehr zu schätzen wissen, wenn da draussen jemand ist, der mir bei dem blöden Problem die Lösung aufzeigt.

Gruß
 
Zuletzt bearbeitet:
Entweder Du gibst die Daten beim Speichern an das ListModel weiter oder Du führst nach dem Speichern nochmal das Statement aus und befüllst das Model neu.
 
Die Daten müssen auf jedenfall erstmal direkt in die MySQL-DB. Das Statement neu ausführen hatte ich auch schon überlegt.

Wie kann ich das realisieren? Die Aktualisierung würde in einer anderen Klasse stattfinden müssen (Aktion in Tab1, aber Änderung in Tab2). Stehe gerade auf dem Schlauch.

Gruß
 
kommt drauf an, wie allgemein oder wie individuell du das alles verknüpfen möchtest,

irgendjemand wird doch sicher Tab1 und Tab2 erzeugen,
an dieser Stelle könntest du Tab1 (oder nur einem Listener darin oder einer sonstigen Kontroll-Klasse)
eine Referenz auf Tab2 geben (oder wieder nur das Model oder was auch immer)

wenn Tab1 seine Aktion ausführt, kann Tab1 auch
tab2.aktualisiereDich();
aufrufen, sofern eine entsprechende Methode da ist,

----

im Grunde ähnlich aber doch bisschen anders:
tab1 spricht nicht mit Tab2, sondern mit einer allgemeinen Kontrollklasse, die alle Tabs kennt (!) (bzw. nur deren Models),
controll.ichHabDaWasEingefügt();
und mehr muss Tab1 gar nicht machen/ wissen,
die Kontrollklasse entscheidet 'Tab1 sagt mir, dass es was eingefügt hat, nun gut, dann halte ich es für richtig, Tab2 zur Aktualisierung zu ermuntern',
 
nein, nicht unbedingt,
an der Stelle, an der die Daten in die DB geschrieben werden,
kann direkt entweder der Befehl andererTab.tueWas() aufgerufen werden oder irgendwelche indirekte Befehle a la
controller.tueWasInAnderemTab()

Observer wäre auch denkbar, wenn Tab sonst niemanden kennt und nur seine Observer informieren möchte
 
Ich hab jetzt in Tab2 drin:

Java:
static void refresh() {
		db = ConnectMySQL.getInstance();
		rs = db.query("SELECT * FROM Tabelle ORDER BY 'ID'");       
        }

und in Tab1 (beim drücken eines Buttons; ActionEvent):

Java:
Tab2.refresh();

leider ändert sich nichts in der Liste?

Gruß
 
ein ResultSet hat keine Auswirkungen auf irgendeine Anzeige,
oder wird das ResultSet in einem Model verwendet oder ähnliches?

das wäre erstens schlecht und zweitens fehlt dann dann ein Befehl wie fireContentsChanged() aus AbstractListModel,

wie sieht denn der Code für die bisher normal funktionierende Aktualisierung der JList aus?

edit:
ach, weiter oben hast du ja
> while (rs.next()) {
> listModel.addElement( rs.getString("id") + ": " + rs.getString("name") );
> }

usw., sowas wird nicht unbedingt automatisch wieder ausgeführt..
 
Noch sieht die JList wie oben aus.

Ich bin davon ausgegangen, dass die Update-SQL-Abfrage die Aktualisierung automatisch vornimmt. Leider daneben.

Die Aktualisierung soll ja durch einen Button geschehen im anderen Tab.
Ich müsste also einmal alle Einträge löschen und wieder hinzufügen in einer Schleife.

Irgendwie so?:

Java:
listModel = list.getModel();
	        ((DefaultListModel) listModel).clear();
for (...) {
((DefaultListModel) listModel).addElement(((???));
}

Was meint ihr?
 
zunächstmal lege eine Variable vom Typ DefaultListModel an und caste EINMAL,
statt bei JEDEM Zugriff neu zu casten

ansonsten könnte es funktionieren, ja
 
Irgendwas stimmt nicht:

Die Liste:
Java:
final DefaultListModel listModel = new DefaultListModel();
        
		db = ConnectMySQL.getInstance();
		rs = db.query("SELECT * FROM tabelle ORDER BY 'ID'");
		         while (rs.next()) { 
		        	 listModel.addElement( rs.getString("id") + ": " + rs.getString("name") );
		         }
		final JList WaehlerListe = new JList(listModel);

die Update-Funktion:
Java:
 public static void updateList(JList list) throws SQLException {	
	     listModel = (DefaultListModel) list.getModel();  
		 listModel.clear();
	        
	        db = ConnectMySQL.getInstance();
			rs = db.query("SELECT * FROM tabelle ORDER BY 'ID'");
			         while (rs.next()) { 
			        	 listModel.addElement( rs.getString("id") + ": " + rs.getString("name") );
			        	 PANEL.repaint();
			        	 PANEL_b.repaint();
			        	 scrollpane.repaint();

	    }

Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at...


Diese Zeile scheint nicht zu stimmen:
Java:
listModel = (DefaultListModel) list.getModel();
 
anscheinend ist list null, wer ruft updateList(JList list) auf, wo wurde list gespeichert usw.,
viel Code hilft in diesem Fall wohl viel,
 
Tab1 ruft die Methode auf:

Java:
Tab2.updateList(WaehlerListe);

WaehlerListe ist dieses Konstrukt:

Java:
final DefaultListModel listModel = new DefaultListModel();
		db = ConnectMySQL.getInstance();
		rs = db.query("SELECT * FROM Tabelle ORDER BY 'ID'");
		         while (rs.next()) { 
		        	 listModel.addElement( rs.getString("id") + ": " + rs.getString("name") );
		         }

		final JList WaehlerListe = new JList(listModel);

Die Update-Methode, die JList (list ist nur Übergabe-Parameter) liegen im Tab2. So ziemlich alles liegt im Tab2.

Gruß
 
und trotzdem kennt Tab1 WaehlerListe?
schwer zu glauben, wieso lautet die Methode nicht updateList(); ohne Parameter?

man kann doch wohl erwarten, dass Tab1 seine eigene JList selber kennt/ irgendwo herbekommt

----

unabhängig davon stellt sich immer noch die Frage, ob WaehlerListe vor dem Aufruf null ist (testen! System.out.println!)
woher diese Variable kommt usw.
 
Totaler denkfehler meinerseits. Sorry.

Also in Tab1 wird jetzt die Methode Tab2.update() aufgerufen. Ohne parameter.
Scheint zu funzen!

Java:
	 public static void updateList() throws SQLException {	
	     listModel = (DefaultListModel)WaehlerListe.getModel();  
		 listModel.clear();
		 
	        db = ConnectMySQL.getInstance();
			rs = db.query("SELECT * FROM tabelle ORDER BY 'ID'");
			         while (rs.next()) { 			    
			        	 listModel.addElement( rs.getString("id") + ": " + rs.getString("name") );
			        	 
			        	 WaehlerListe.setModel(listModel);
			        	 PANEL.repaint();
			        	 PANEL_b.repaint();

	        }

	    }

In der Update-Methode spreche ich jetzt WaehlerListe direkt an.

Gruß
 
wo und wann tritt die Exception auf, was hat WaehlerListe.getSelectedIndex() mit dem update zu tun?
oder tritt das bei einer anderen Aktion auf?

> WaehlerListe.clearSelection();
> Aber es wird immer an der getID gemeckert.

wie jetzt?, nach clearSelection() wird ja wohl getSelectedIndex() -1 sein, also kein Wunder,
vor clearSelection() wird irgendwas selektiert sein oder nicht, aber was hat clearSelection() damit zu tun?

> erledigt.

puh
 
Die Exception war bzw. ist eine andere Aktion:

In der JList wähle ich einen Nachnamen aus und danach füllt mir das Programm Textfelder mit allen Informationen (ChangeListener).

Da ich in die Liste als erstes IDs einlese, hole ich diese mit getSelectedValue raus. Funktioniert auch so.

Stehen dann zwar immer Zahlen in der JList, aber ist nicht schlimm.

Gruß
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben