2010-11-20 13 views
5

私の最終的な目標は、実行時にコンテンツを更新するJListを持たせ、この投稿のhere on SOから解決する解決策を見つけました。私の元の考えはしませんでした。クラスを引数としてJListの.setModel()メソッドを使用する

今のところ、私はこのセットアップのようなものを持っており、それが動作します:

以下
DefaultListModel default = new DefaultListModel(); 

for(int i = 0; i < array.size() ; ++i){ 
    test.addElement(array.get(i)); 
} 
list.setModel(default); 

は私の当初の計画でした。私はListModelを実装したクラスを引数として渡して、JListをリフレッシュすることを望んでいました。

SomeClass test = new SomeClass(); //Implements ListModel 
list.setModel(test); 

または

SomeClass test = new SomeClass(); //Implements ListModel 
list = new JList(test); 

どちらも私を混乱させるこれらの作業の。これらの最後の2つのメソッドがいくつかの機能を果たすことができますか?コードは非常にクリーンです。

ありがとうございました。

+0

このクラスのインスタンスではなく、クラスListModelを渡すことは、コンパイラエラーです。なぜあなたは混乱していますか? – Istao

+0

私のコードデモは、少し誤解を招くと思います。私がやっていることは、これをもっと明確にするためにコードを変更します。 – Koop

+1

最後の2つの方法はなぜ機能しないのですか?表示されているエラーを入力してください。 'SomeClass'が' ListModel'を拡張すると、それらのメソッドの両方が動作します。 –

答えて

3

ListModelを正しく実装すると、最初のアプローチが有効です。重要な点は、データを変更するときに呼び出す必要があることです。

fireContentsChanged(...); 

(これは私があなたのことを前提としています)。このメソッドを呼び出すと、JListに自身を再描画するよう指示します。

メモリに座っている新しいJListコンポーネントを作成するだけなので、2番目の方法は機能しません。コンポーネントを作成しても、GUIには追加されません。したがって、この方法を使用する場合は、元のJListをGUIから削除し、新しいJListをGUIに追加する必要があります。これはあまり便利ではないので、このアプローチを使用すべきではない理由があります。モデルを設定することは常に望ましいアプローチです。

+0

はAbstractListModelまたはカスタムメソッドの一部であると思われるfireContentsChanged()ですか?また、これは単にすべての値を繰り返しますか?ありがとう。 – Koop

+0

JListにListModelを追加すると、JListによってリスナーがモデルに追加されます。モデルを変更すると、モデルはデータが変更されたことをビュー(リスト)に通知し、ビューはそれ自身を再描画できます。この通知は、AbstractListModelの一部であるfireXXXメソッドによって行われます。そのため、カスタムモデルを作成するときに、抽象モデルを拡張して、ホイールを再構築してビューに通知する必要がないようにする必要があります。あなたがするのは、適切なfireXXXメソッドを呼び出すことだけです。 – camickr

1

最初のケースは私の心の中の解決策のようです。テスト可能な例を提供できますか?

変数を再利用しているだけで、GuiのJListを実際に変更していないため、2番目のケースは機能しません。私はすでにこのリストをコードの前の方に追加したと仮定しています。

0

ほとんどの場合、ListModelの実装が間違っている可能性があります。

関連する問題