Swing JList Auswahl-GUI-Konzept

MayR42

Mitglied
Hallo zusammen!

Im Rahmen einer Studienarbeit darf ich folgendes realisieren:

Ich will in Java für einen breiten Benutzerkreis ein Dialogfenster erstellen, in dem zwei JList-Listen enthalten sind. Der Benutzer soll in der linken JList Elemente auswählen können und sie mit einem „Hinzufügen“-Button in die rechte Liste verschieben bzw. mit einem „Entfernen“-Button aus der rechten Liste wieder zurückschieben.

Bestimmt kennt jeder so eine Oberfläche.

Die linke JList kann bis zu 2000 Einträge enthalten. Die Listen müssen sortiert sein und jeder Eintrag darf nur einmal vorkommen. Der Benutzer hat die Möglichkeit über Checkboxen bestimmte Filter für die Listen zu aktivieren um die Einträge zu reduzieren.

Meine Realisierungsidee sieht wie folgt aus:

Ich lade mir die verfügbaren Daten aus einer Hashmap (ca. 5000 Datensätze) in ein TreeSet um doppelte Einträge zu vermeiden und um die Daten gleich zu sortieren. Daraufhin werden die Daten in eine DefaultList geladen und an das JList-Model übergeben.

Was haltet ihr davon?

Da der Benutzer die Liste wahrscheinlich oft filtert oder Einträge verschiebt, müssen die Listen wahrscheinlich oft aktualisiert werden. Ich habe ein wenig Bedenken, dass es zu Performance-Problemen kommen kann. Habe aber keine andere Realsierungsidee.

Viele Grüße
 

andy82

Mitglied
Hallo MayR42,
tatsächlich hat Swing DefaultListModel Performance-Problemen. Darüber hatte ich mal hier im Forum geschrieben. DefaultListModel bietet nur Methoden an, um einzelnes Item hinzufügen (ob addElement(E element), add(int index, E element), oder setElementAt(…), ...), nicht aber wie andere Komponent eimal komplett eine Collection hizugefügt wird. Sehen wir z.B. die Code einer Methode:
Code:
private Vector<E> delegate = new Vector<E>();
public void add(int index, E element) {
     delegate.insertElementAt(element, index);//Item wird addiert
     fireIntervalAdded(this, index, index);
}
Bei Methode fireIntervalAdded(…) wird Jlist.repaint() aufgeruft, also für Deine 2000-5000 Datensätze Deine GUI sovielmal neugezeichnet. Diese Phänomen bemerkte ich seit ca. 15 Jahren, und es wird nicht korrigiert. Ich glaube nicht, dass bei SUN (oder Oracle) keine gewusst hätte. Bei DefaultComboBoxModel oder ListView bieten sie z.B. über Konstruktor die Collection zu ersetzen, GUI wird nur einmal neugezeichnet. Man hat keine Chance, die Methoden zu überladen (-schreiben), weil Vector delegate private definiert ist.
Heuzutage emfehle ich lieber zu JavaFX zu benutzen. Wenn Du unbedingt bei Swing bleibt, rate ich eher zu JTable zu benutzen. Falls Du unbedingt bei Jlist bleibt, bleibt wohl nur die Lösung (was ich damals auch getan hatte) neue Class DefaultListModel in eigenem Projekt zu bauen, in dem ich die ganze Original-Source-Code übernimmt, erweiterte mit add(index, Collection) bzw. setItems(Collection) - Collection wird zuerst ersetzt(addiert), erst dann wird fire-Methode aufgerufen.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Alternativ AbstractListModel erweitern und die Methode getElemenAt(int index) und getSize() überschreiben. Dann die benötigten add-Methoden implementieren, die z. B. das Hinzufügen aller Elemente einer Collection ermöglichen könnte. Dabei sollte fireIntervalAdded(Object source, int index0, int index1) erst dann aufgerufen werden, wenn der Einfügevorgang abgeschlossen ist.
 

MayR42

Mitglied
Vielen Dank für eure Lösungsvorschläge!
Ich muss Swing verwenden und kann leider kein FX einsetzen.
Dadurch das die Elemente in der JListe nur einmal vorkommen dürfen und sortiert sein müssen, bin ich noch am überlegen, ob ich meine eigene Implementierung besser wäre als der Umweg über TreeSet mit anschließender Schleife über TreeSet=>DefaultList :confused:
 

Harry Kane

Top Contributor
Wenn der tausendfache Aufruf von DefaultListModel.add oder addItem tatsächlich ein bottleneck ist, versuchs mal mit TreeSet<T> --> T[] (Konvertierung zu einem Array, das TreeSet bietet dafür eine fertige Methode an), dann DefaultListModel.copyInto(Object[] anArray).
 

MayR42

Mitglied
@Harry Kane: Warum ist das kopieren von TreeSet<T> --> T[]-Array --> DefaultList schneller als z.B.

Code:
while ( iterator.hasNext()) {
            fElement = (MinClone) iterator.next();
            anzeigeListe.addElement( fElement.getId());
        }
 

Harry Kane

Top Contributor
Weil im ersten Fall das DefaultListModel nur einmal einen event feuern sollte, der die JList dazu bringt, sich selber zu zeichnen. Im zweiten Fall mit dem code snippet sollte jeder Aufruf von addElement zu einem Neuzeichnen führen, was die Sache verlangsamt.
Darf ich deine Frage so interpretieren, dass die von mir vorgeschlagene Variante tatsächlich schneller ist?
 

Neumi5694

Top Contributor
Du machst dir da etwas zu viele Sorgen.
So lange du nicht mit addElement usw. arbeitest, ist die Performance kein Thema. 5000 Einträge sind für ein Set überhaupt kein Problem. Nach dem Fertigstellen des Sets setze ein neues Listmodel (lass es NICHT direkt auf dem Set basieren, sondern auf einer Kopie, z.B. auf einem Array oder einer Arraylist), anschließend selektiere das neue Element. Dann kriegst du auch nur einen Event.
Die GUI sprich immer erst dann an, wenn deine Arbeit mit den Listen/Sets/Filtern oder was auch immer beendet ist, dann hast du überhaupt kein Problem mit der Performance.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing jList Auswahl löschen AWT, Swing, JavaFX & SWT 2
N JList: Auswahl erzwingen 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
A Swing JList zu JTree AWT, Swing, JavaFX & SWT 11
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
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
TheWhiteShadow JList-Inhalt nach Änderung weg AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben