2012-03-25 10 views
6

Ich habe eine JList, die ein DefaultListModel verwendet.Java - Aktualisieren der JListe nach dem Ändern eines Objekts

Ich füge dann Werte zum Modell hinzu, die dann in der JList erscheinen. Ich habe einen MouseListener erstellt, mit dem der Benutzer die aktuelle Benutzernummer der ausgewählten Person bearbeiten kann.

Ich habe überprüft, dass das tatsächliche Objekt des Datensatzes geändert wird, und es ist. Das einzige Problem, das ich habe, ist, die aktuelle Jlist zu aktualisieren, um die neuen Werte dieses Objekts anzuzeigen.

Snippets des aktuellen Code ich habe, sind:

Erstellen der JList und DefaultTableModel:

m = new DefaultListModel(); 
m.addListDataListener(this); 
jl = new JList(m); 
jl.addMouseListener(this); 

Aktualisierung des Objekts:

String sEditedNumber = JOptionPane.showInputDialog(this, "Edit number for " + name, number); 
if (sEditedNumber != null) { 
    directory.update (name, sEditedNumber); 
} 

Und (wenn jl ist die JList und m ist das DefaultTableModel):

public void contentsChanged(ListDataEvent arg0) { 
     jl.setModel(m); 
    } 
+1

Warum verwenden Sie einen 'MouseListener' anstelle eines [' ListSelectionListener'] (http://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html)? – trashgod

Antwort

3

Sie müssen fireContentsChanged() auf dem Listmodel nennen.

+0

Kann ich dies auf DefaultListModel tun? – mino

+0

@ M92: Warum nicht seit DefaultListModel erstreckt sich von AbstractListModel? –

+0

Ich bin mir nicht sicher, wie ich das umsetzen soll, könnte ich eine Anleitung bekommen? Ich kann es nicht funktionieren lassen. Wo füge ich es hinzu und wie verwende ich es, um die JList zu aktualisieren? Ich versuche den bereitgestellten Link zu benutzen, aber nicht weit zu kommen. – mino

11

Statt setModel(), aktualisieren Sie Ihr bestehendes Modell eines der DefaultListModel Methoden wie setElementAt() verwenden, das wird fireContentsChanged() für Sie.

+0

Siehe auch [* Wie verwende ich Listen *] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html). – trashgod

0

Sie müssen DefaultListModel.fireContentsChanged() anrufen. Aber da diese Methode geschützt ist (ich frage mich wirklich warum), können Sie das nicht direkt tun. Stattdessen eine kleine Unterklasse machen:

class MinoListModel<T> extends DefaultListModel<T> 
{ 
    public void update(int index) 
    { 
     fireContentsChanged(this, index, index); 
    } 
} 

es als Ihre Liste Modell verwenden:

m = new MinoListModel<>(); 
jl = new JList(m); 

Nach einer Benutzernummer zu aktualisieren, aktualisieren Sie den entsprechenden Eintrag: m.update(theIndex);

Alternativ, wenn Sie don‘ Wenn Sie eine Unterklasse wünschen, können Sie einfach das JList-Element ersetzen, nachdem sich die Benutzernummer geändert hat: m.setElementAt(theSameElement, theIndex);. Obwohl dies etwas umständlich ist und eine Unterklasse zu haben scheint, ist es die sauberere Herangehensweise.