2016-04-14 10 views
0

Ich habe eine JList, die Elemente aus einem ArrayList von Objekten und zeigt einige Elemente aus dem Objekt im Listenbereich. Wenn ich dieses Element auswähle, zeigt es die vollständigen Informationen in anderen Feldern und Etiketten an. Im Rahmen meiner Programmumsetzung kann ich auch Objekte zur ArrayList hinzufügen und entfernen. Was ich gerne tun würde, ist jedes Mal, wenn die ArrayList geändert wird, wird die JList aktualisiert, um den neuen Zustand der ArrayList widerzuspiegeln. Unten ist der Code für mein JList Element.JList dynamisch von Ereignissen aktualisieren

DefaultListModel<String> defListModel = new DefaultListModel<String>(); 
    if(studentList.size() > 0){ 
     for(int i = 0; i < studentList.size(); i++){ 
      Student aStudent = studentList.get(i); 
     defListModel.addElement(aStudent.toString()); 
     } 
    } 
    JList<String> list = new JList<String>(defListModel); 
    list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
    JScrollPane scroll = new JScrollPane(list, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); 
    ListSelectionModel listSelectionModel = list.getSelectionModel(); 
    listSelectionModel.addListSelectionListener(new SelectionListener()); 
    scroll.setBounds(16, 24, 130, 205); 
    mainPanel.add(scroll); 

Wie würde ich diese Liste dynamisch aktualisieren, wenn Elemente hinzugefügt und entfernt werden? Bitte stellen Sie keine vollständige Lösung zur Verfügung (da ich finde, dass ich dadurch besser lerne), aber alle hilfreichen Hinweise oder Vorschläge, bei denen ich eine Lösung finden könnte, wären willkommen.

Antwort

3

Ihre DefaultListModel verfügt über alle Methoden, die Sie brauchen:

void DefaultListModel#addElement(E element); 
void DefaultListModel#add(int index, E element); 
E  DefaultListModel#remove(int index); 
boolean DefaultListModel#removeElement(Object obj) 

Wenn Sie Elemente aus der Liste hinzufügen/entfernen, können Sie die gleiche Änderung des Modells JList machen kann.


Wenn Sie nur Updates für Ihre DefaultListModel machen, können Sie sich erholen Ihre ArrayList mit:

studentList = Collections.list(defListModel.elements()); // creates new ArrayList 

oder, wenn andere Hinweise auf studentList eingehalten werden muss:

studentList.clear(); 
studentList.addAll(Collections.list(defListModel.elements())); 

EDIT Whoops! Es tut uns leid. Ihr ArrayList<?> studentList ist von einem unbekannten nicht spezifizierten Typ; Wir können die ursprüngliche Liste nicht wiederherstellen.Selbst die ArrayList<String> von Schülernamen können nicht zuverlässig zu einzelnen Schülern zurückverfolgt werden, da #toString() bei jedem Aufruf ein anderes String zurückgeben kann, je nachdem, wie es implementiert ist, und Studentennamen dürfen nicht eindeutig sein. Sie müssen nur die gleichen Operationen für beide Listen durchführen.


EDIT Der Standard-Renderer für eine JList wird in der Liste #toString() auf die Objekte aufrufen. Anstatt defListModel.addElement(aStudent.toString()) aufzurufen, könnten Sie die tatsächlichen Objekte zu den entsprechend typisierten JList/DefaultListModel hinzufügen.

DefaultListModel<Student> defListModel = new DefaultListModel<>(); 
// ... 
    defListModel.addElement(aStudent); 
// ... 
JList<Student> list = new JList<>(defListModel); 

Mit dieser Änderung kann die defListModel die entsprechenden Änderungen an der Studentenliste geändert und werden mit zurückgewonnen werden:

studentList = Collections.list(defListModel.elements()); 
2

Zwei Lösungen sofort in den Sinn kommen:

  1. keine Arraylist überhaupt , Verwenden Sie
    • stattdessen die DefaultListModel benutzen, um Ihre Sammlung von Daten zu halten.
    • Dann jedes Mal, wenn Sie Elemente aus diesem Modell hinzufügen oder entfernen, wird die JList automatisch aktualisiert.
  2. Oder ja, verwenden Sie eine Arraylist Ihre Daten
    • Und dann das gleiche Arraylist JList Datenmodell als Kern des eigenen Code erstellt verwenden zu halten.
    • Das bedeutet nicht mit einem DefaultListModel sondern eher von AbstractListModel<MyType>.
    • Dann, wenn Sie Daten von Ihrer Arraylist hinzuzufügen oder zu entfernen, Sie muss erinnern die entsprechende AbstractListModel fireXxx(...) Methode aufrufe, so dass das Modell die Ansicht benachrichtigt wird (hier der JList) von Änderungen, so dass er seine Anzeige ändern kann.
Verwandte Themen