JList, JTree, JTextarea - Daten"refresh"

Status
Nicht offen für weitere Antworten.

diggaa1984

Top Contributor
hiho,

wie immer ein sehr toller titel :D



Ich stehe grad vor folgendem Problem:

ich habe eine zentrale Datenklasse, welche vorerst eine ArrayList<Person> beinhaltet, wird später noch mehr dazu kommen.

Ich möchte die Daten dieser ArrayList nun auf versch. Komponenten verteilen und anzeigen. In einem JTable sehe ich so ziemlich alles an Personen-Eigenschaften. Dennoch würde ich zwecks Suche oder später auch im Sinne von Filtern einige Daten (z.B. Name, VName) in JLists oder JTrees abbilden.

Wie löse ich es nun am Besten, dass ich diese Komponenten alle aktuell halte (sprich Druck auf Toolbarbutton = neue Person .. impliziert neuer Eintrag in Tabelle, Liste etc.). Bisher habe ich die Tabelle als einzelnen Listener registriert, der Rest ist noch nicht da, aber würde es Sinn machen, an die 6-7 Swing-Komponenten als Listener an der Datenklasse zu registrieren, oder gibt es da andere üblichere Wege zentrale Daten(-änderungen) zu propagieren!?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
die Datenklasse bekommt schonmal gar keinen Listener,
die Datenklasse, sei es 'PersonList' oder nur eine ArrayList<Person>, wird einem neu definierten MetaPersonModel übergeben (idealerweise als Kopie),
dieses bekommt 6-7 Listener, aber eher keine Swing-Komponenten, sondern ListModel, TableModel usw,
diese haben dann jeweils ihre Swing-Komponenten JTable, JList usw. als einzelne Listener ;)

alternativ könnte man versuchen, das MetaModel diverse Interface (ListModel, TableModel usw) implementieren zu lassen
 

Wildcard

Top Contributor
Schreib dir Adapter, die dein Datenmodell auf Swing Interfaces adaptieren/übersetzen können. So musst du die Daten nur einmal halten und alles bleibt synchron. Es bietet sich zB eine AdapterFactory an.
Beispiel:
[HIGHLIGHT="Java"]ListModel listView = (ListModel)AdapterFactory.getAdapter(model,ListModel.class);[/HIGHLIGHT]
 

diggaa1984

Top Contributor
aso ja, das mit dem models ist klar :D war falsch ausgedrückt, aber was genau meinst mit
die Datenklasse, sei es 'PersonList' oder nur eine ArrayList<Person>, wird einem neu definierten MetaPersonModel übergeben (idealerweise als Kopie),

also meine Datenklasse hat eben die ArrayList, und ist zuständig für deren Mächtigkeit (neue Datensätze anlegen, löschen, etc.) .. also die Menge an Daten verwalten.
was wäre der Sinn einer weitere Äusseren klasse!? Die Actions der Buttons sind ja wie folgt (addPerson(...) .. deletePerson(...)) .. also die Actions rufen die Methoden der zentralen Datenklasse auf um die Mächtigkeit zu verändern. Eine nocht weiter oben angesiedelte Klasse würde die Aufrufe nur durchleiten, das wäre für mich nicht sinnvoll.

Oder habe ich einen gravierenden Nutzen übersehen?!
 

diggaa1984

Top Contributor
Schreib dir Adapter, die dein Datenmodell auf Swing Interfaces adaptieren/übersetzen können. So musst du die Daten nur einmal halten und alles bleibt synchron. Es bietet sich zB eine AdapterFactory an.
Beispiel:
[HIGHLIGHT="Java"]ListModel listView = (ListModel)AdapterFactory.getAdapter(model,ListModel.class);[/HIGHLIGHT]

das ist an sich eine feine Idee, dennoch hilft mir das nich beim Propagieren von Änderungen, oder? Wenn ich per Tollbar den Datensatz erweitere .. bekommen die ListModels und TabelModels dieses ja auch trotz Adapter nicht automatisch mit, wenn ich davon ausgehe,dass der Adapter nur die Konvertierung der Daten in geeignetes Format vornimmt. Also eine Art Notification muss ich rumschicken, frage ist eben nur wo ich diese dann in deiner Variante anbinden würde.

Ach seh grad, der Adapter könnte ja dann die Anmeldung als Listener vornehmen korrekt!?
 
G

Gast2

Gast
Reichen für sein Vorhaben nicht einfach die Klassen PropertyChangeListener und PropertyChangeSupport?So wie ich das verstanden hab will er alle "Listener" benachrichtigen wenn sich irgendwas in seinen Daten geändert hat
 

Wildcard

Top Contributor
Ach seh grad, der Adapter könnte ja dann die Anmeldung als Listener vornehmen korrekt!?
Korrekt, irgendeine Art von Notification Mechanismus sollte dein Datenmodell bieten (nach Möglichkeit aber nicht Swing spezifisch), das ist auch durchaus üblich.
Vielleicht wagst du auch mal einen Blick über den Tellerrand und verwendest ein EMF Modell anstatt dir selbst eins zu basteln. Das bietet dir unter anderem:
  • Databinding
  • Notification Support
  • Adapter Support
  • Adapter Factories
  • generische Präsentations und Edit Schicht
  • hält sich selbstständig konsistent
  • erweiterbar
  • und vieles mehr
 

Wildcard

Top Contributor
Ich habe nicht alles gelesen, aber dieser Artikel beschreibt eine solche Adapter Lösung mit einem EMF Modell beispielhaft für ein JLabel. Das 'text' Property eines JLabels wird per adapter an ein 'name' Feature eines EMF Objekts gebunden. Die gleiche Lösung lässt sich auf Tabellen, Listen, Bäume, SWT, JFace, AWT, Swing,... anwenden. Man braucht nur den passenden Adapter.
Sieht übrigens erstmal komplizierter aus als es in Wirklichkeit ist ;)
EMF ist allerdings definitiv eine Investition in die zukünftige Qualität deiner Software. Für mich eines der Java Tools schlechthin.
Exception
 

diggaa1984

Top Contributor
hm wäre mal eine Überlegung wert die Datenstrukturen wie ich sie jetzt hab in einem 2. Projekt mittels EMF umzusetzen ... das ist ja schon ein kleiner Batzen der da mit einmal vor mir liegt und verstanden werden will :D
 

Wildcard

Top Contributor
Nach meiner Erfahrung ist die Haupteinsteigshürde bei EMF nicht das verwenden, sondern das akzeptieren, dass alles was man bisher händisch getan hat, automatisiert viel besser funktioniert und einem tatsächlich abgenommen wird.
Besonders wer aus der JAXB Ecke kommt, hat oft Probleme mit dem Konzept.
Beispiel :
Code:
Parent1
 +-Kind1
 +-Kind2

Parent2
 +-Kind3

EMF:
[HIGHLIGHT="Java"]parent2.getChildren().add(kind1);[/HIGHLIGHT]

Ergebnis:
Code:
Parent1
 +-Kind2

Parent2
 +-Kind3
 +-Kind2
Das generierte Modell besteht nicht nur aus stupiden, von zB JaxB bekannten Datencontainern. Stattdessen weiß es selbst, das ein Kind nur einen Parent haben darf und ändert daher alle Referenzen entsprechend.
Wer mal verstanden hat, das man sich um diese Details nicht mehr kümmern muss, da das Model sich am besten selbst verwalten kann, der wird EMF nicht mehr missen wollen.

Anderes Beispiel:
Das leidige Thema mit Listen. Gibt man sie nach aussen? Gibt man eine Kopie nach aussen? Gibt man eine Read-Only Sicht nach aussen? Macht man add und remove Methoden? Was ist wenn mal umsortiert werden soll? Alle Entfernen und neu einfügen?
Warum die Verenkungen? Weil man von Listen keine Notifications bekommt und das Modell in inkonsistene Zustände überführt werden kann.
EMF geht einen anderen Weg. Listen werden als echte Referenzen nach aussen gegeben, die einfachste Art die Daten zu manipulieren.
Aber alle Listen erweitern die Java Collections und sind nun in der Lage die Notification Chain bei Änderungen zu informieren, Referenzen upzudaten und Typen zu validieren (auch ohne Generics).
Sicher, man muss sich auf das Konzept einlassen und initial (ein wenig) Aufwand investieren, aber es zahlt sich meiner Meinung nach hundertfach wieder aus.
 

diggaa1984

Top Contributor
Das leidige Thema mit Listen. Gibt man sie nach aussen? Gibt man eine Kopie nach aussen? Gibt man eine Read-Only Sicht nach aussen? Macht man add und remove Methoden? Was ist wenn mal umsortiert werden soll? Alle Entfernen und neu einfügen?
Warum die Verenkungen? Weil man von Listen keine Notifications bekommt und das Modell in inkonsistene Zustände überführt werden kann.

SIGN :toll:
 
S

SlaterB

Gast
mein Gedanke war jedenfalls noch, durch Kopie eine Trennung zwischen in der GUI angezeigten und irgendwo intern verwalteten Personen zu ziehen,
das ist vielleicht nur bei mehreren Threads/ Usern/ Aktionen gleichzeitig relevant,

jedenfalls sollte ein add-Button-Klick, der vielleicht gar nur ein initial halb gefülltes Platzhalter-Element in die Liste einfügt, nicht gleich die wichtige Datenhaltung des ganzen Programms ändern
 

diggaa1984

Top Contributor
jedenfalls sollte ein add-Button-Klick, der vielleicht gar nur ein initial halb gefülltes Platzhalter-Element in die Liste einfügt, nicht gleich die wichtige Datenhaltung des ganzen Programms ändern

würde für mich nur Sinn ergeben, wenn im Anschluss daran ein Dialog aufgeht der einige grundlegende Infos editieren/setzen lässt. Wenn man ihn bestätigt wird die originale Datenstruktur erweitert, anderfalls nicht.

Oder, wie du sagtest, wenn nebenläufige Zugriffe auf die Datenstruktur erfolgen, das kann ich allerdings komplett aussschließen. In dem Fall würde dann ein Thread, wenn er denn an der Reihe ist die Daten von der Kopie ins Original übernehmen, oder wie wäre das in deiner Vorstellung?
 
S

SlaterB

Gast
neben der Tabelle ein 'Speichern'-Button, was auch immer das heißt ohne dass jetzt hier die Persistenz besprochen wurde
 

diggaa1984

Top Contributor
ja gut, vergleichbar mit nem expliziten "commit" im svn oder das Starten einer Folge von Transaktionen (alle bisher durchgeführten Änderungen) zu einer DB .. aber in meinem Programm weniger notwendig
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
E Drag & Drop von jTree in JList AWT, Swing, JavaFX & SWT 5
C JTree mit JList nachbauen AWT, Swing, JavaFX & SWT 6
B Jlist füllen AWT, Swing, JavaFX & SWT 4
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
J Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
cezary Choice, JComboBox oder JList AWT, Swing, JavaFX & SWT 5
J JList scrollen AWT, Swing, JavaFX & SWT 3
Neumi5694 Swing JList - Klick abfangen AWT, Swing, JavaFX & SWT 3
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
M Swing JList Auswahl-GUI-Konzept AWT, Swing, JavaFX & SWT 9
C JList: Bestimmte Objekte ausschließen AWT, Swing, JavaFX & SWT 1
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
F JList bei Windowbuilder AWT, Swing, JavaFX & SWT 8
F JList zeigt keine Einträge mehr AWT, Swing, JavaFX & SWT 1
P JList erstellen AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
P Übergeben von ListModel an nichtparametrisierte JList AWT, Swing, JavaFX & SWT 8
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
J Swing Probleme mit ListSelectionListener(), Inhalte der JList werden gelöscht? AWT, Swing, JavaFX & SWT 6
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
Nabbit Über JList kein JPopupMenu AWT, Swing, JavaFX & SWT 2
O Swing JList beim Klicken in der GUI erstellen AWT, Swing, JavaFX & SWT 6
C Swing JList zeigt keine neuen Einträge an AWT, Swing, JavaFX & SWT 1
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
T Generische Klasse in JList über DefaultListModel AWT, Swing, JavaFX & SWT 1
T Swing WindowBuilder: JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
C Hilfe bei JSpinner und JList AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
S JList ist leer, aber DefaultListModel hat die Daten? AWT, Swing, JavaFX & SWT 9
M JList wird angezeigt, JTable (DefaultTableModel) nicht AWT, Swing, JavaFX & SWT 7
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
W Sichtbarer Bereich JScrollPane vs. JList AWT, Swing, JavaFX & SWT 3
N AWT Markierte Zeile jList aus mySQL DB löschen AWT, Swing, JavaFX & SWT 2
S JList repaint AWT, Swing, JavaFX & SWT 1
F Swing JTextField in JList (Funktion beibehalten) AWT, Swing, JavaFX & SWT 2
H JList AWT, Swing, JavaFX & SWT 5
B Swing Bild von Webseite herunterladen, diese dann in JList anzeigen. AWT, Swing, JavaFX & SWT 1
B Swing Dynamische JList mit Bildern AWT, Swing, JavaFX & SWT 4
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
S JList Index finden AWT, Swing, JavaFX & SWT 6
3 Swing JList-Inhalt als verschlüsselte Datei schreiben und lesen AWT, Swing, JavaFX & SWT 1
N JComponenten in JList oder doch anders? AWT, Swing, JavaFX & SWT 0
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
B Tabelleneinträge in JList anzeigen AWT, Swing, JavaFX & SWT 5
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
D Swing JList keine Selektionsänderung bei "dragged-Maus" AWT, Swing, JavaFX & SWT 4
M JList Model filtern AWT, Swing, JavaFX & SWT 4
K Swing JList - Element richtig hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
P Swing JList mit Objekten - Name anzeigen AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
K Mehrfachselektierungen in einer JList AWT, Swing, JavaFX & SWT 6
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M Swing JList Listener AWT, Swing, JavaFX & SWT 20
M Accelerator zu JMenuItem des JPopupMenu einer JList AWT, Swing, JavaFX & SWT 2
S Swing JList wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
M Element aus JList eines JFileChooser entfernen AWT, Swing, JavaFX & SWT 3
E selektierter Datensatz in JList als String Datentyp AWT, Swing, JavaFX & SWT 23
E selektiertes Element aus JList zurückgeben AWT, Swing, JavaFX & SWT 7
E JList /DefaultListModel mit Datenbank verbinden AWT, Swing, JavaFX & SWT 10
L SQL & Jtable o. JList AWT, Swing, JavaFX & SWT 5
K Swing JList und veränderte CellRenderer AWT, Swing, JavaFX & SWT 8
B JList + ListCellRenderer AWT, Swing, JavaFX & SWT 5
B JList -> Disabled AWT, Swing, JavaFX & SWT 6
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
I Jlist isselectionEmpty AWT, Swing, JavaFX & SWT 4
I Jlist dynamisch aus Datenbank füllen AWT, Swing, JavaFX & SWT 14
R Swing unbegrenzte Anzahl vonEinträgen in JList AWT, Swing, JavaFX & SWT 2
MiMa Dateien aus Ordner in einer JList Ausgeben AWT, Swing, JavaFX & SWT 32
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
M JList mit 2-zeiligen Objekten füllen AWT, Swing, JavaFX & SWT 7
S JList mit Einträgen versehen schlägt fehl AWT, Swing, JavaFX & SWT 4
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
S Fragen zu JList AWT, Swing, JavaFX & SWT 3
B Aktualisierung einer JList AWT, Swing, JavaFX & SWT 5
W JList valueChanges weiterleiten? AWT, Swing, JavaFX & SWT 14
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
E Jlist nur mit Klasse? AWT, Swing, JavaFX & SWT 5
D Swing JList <-> AdapterModel <-> Model AWT, Swing, JavaFX & SWT 4
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
M JList mit DefaultListModel und listener AWT, Swing, JavaFX & SWT 4
B JList nach dem Rendern sortieren AWT, Swing, JavaFX & SWT 3
T Wie ist das "Lookup-Verhalten" von JList, JCombobox änderbar? AWT, Swing, JavaFX & SWT 4
D JList items voneinander trennen AWT, Swing, JavaFX & SWT 10
E Keine Ausgabe von JList bei drücken von Button auf die Konsole AWT, Swing, JavaFX & SWT 7
M gleiches Element in JList mehrmals hintereinander auswählen AWT, Swing, JavaFX & SWT 6
T JList und Objekte AWT, Swing, JavaFX & SWT 7
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
V JList filtern AWT, Swing, JavaFX & SWT 6
GianaSisters jList nur einmal ein Element anklicken AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben