2012-03-25 20 views
6

私はDefaultListModelを使用するJListを持っています。Java - オブジェクトを変更した後にJListを更新する

次に、JListに表示されるモデルに値を追加します。私は(ダブルクリックすると)選択した人の現在のユーザー番号を編集できるMouseListenerを作成しました。

私は、そのレコードの実際のオブジェクトが変更されていることを確認しました。私が抱えている唯一の問題は、実際のJlistを更新してそのオブジェクトの新しい値を表示することです。

私が持っている現在のコードのスニペットは、次のとおりです。JListのとのDefaultTableModelを作成

オブジェクトの更新

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

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

と(JLをJListであり、mはDefaultTableModelです)。

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

[ListSelectionListener'](http://docs.oracle.com/javase/tutorial/uiswing/events/listselectionlistener.html)の代わりに 'MouseListener'を使用しているのはなぜですか? – trashgod

答えて

3

あなたはListModelの上fireContentsChanged()を呼び出す必要があります。

+0

DefaultListModelでこれを行うことはできますか? – mino

+0

@ M92:DefaultListModelはAbstractListModelから継承しています。 –

+0

これを実装する方法がわかりませんが、ガイダンスを得ることはできますか?私はそれを働かせるように見えない。どこに追加しますか?JListを更新するためにどのように使用しますか?私は提供されたリンクを使用しようとしていますが、遠くには到達しません。 – mino

11

の代わりに、setElementAt()のようなDefaultListModelのいずれかの方法を使用して既存のモデルを更新します。これはfireContentsChanged()となります。

+0

[*リストの使用方法*](http://docs.oracle.com/javase/tutorial/uiswing/components/list.html)も参照してください。 – trashgod

0

DefaultListModel.fireContentsChanged()に電話する必要があります。しかし、この方法は保護されているので(私は本当にそれを疑問に思います)、あなたはそれを直接行うことはできません。代わりに、小さなサブクラスを作る:

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

はあなたのリストのモデルとして使用してください:ユーザー数を更新した後

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

、対応するエントリの更新:あなたはドン場合は、代わりにm.update(theIndex);

」をサブクラスが必要な場合は、ユーザ番号が変更された後にJList要素を置き換えることができます:m.setElementAt(theSameElement, theIndex);。これは多少面倒ですが、サブクラスを持つ方がクリーンなアプローチに見えます。

関連する問題