2009-04-13 12 views
6

JListのカスタムセルレンダラを作成するたびに、それに追加する要素はアクションに応答しません。例えば、セルレンダラーが要素を持つJPanelを返すようにした場合、そのうちの1つにActionListenerがあり、それはまったく応答しません。Java Swing - JListカスタムセルレンダリング - キャプチャアクション

これはなぜですか?

+1

非常に良い質問です。私はそれがItemListenersと関係があるかもしれないと思ったが、今はそうは思わない...サンプルコードを見つけようとしたが成功しなかった。 – Uri

+0

こんにちは、私は同じ問題に直面しています、あなたは問題を解決することができますか? – user236501

答えて

6

リストセルレンダラーとして返すアイテムは、正確には:レンダリングを対象としています。リスナーをJListに登録します(通常、ListSelectionListenerが必要です)。

11

getListCellRendererComponent()への各呼び出しは再設定することになっているレンダラは、細胞のためのコンポーネントを返すために、工場のように見えるかもしれないが、実際にはアプローチをレンダリングフライ級に続き、すべてのセルをレンダリングするための同じコンポーネントを使用しています特定のセルの同じコンポーネントインスタンスを返し、セルをレンダリングできるように返します)。

JList(およびJTableおよびJTree)は、各セルのコンポーネントをインスタンス化しなくても大量のセルを表示できます。副作用として、レンダリングコンポーネントはイベントに応答できません。これはレンダリングループでのみ使用され、コンポーネントツリーには表示されないためです。

ニール・コフィーは​​、あなたの代わりにJListJTableJTree)にあなたのリスナーを追加し、影響を受けたセル派遣ため、セル固有のロジックに対処するためのヘルパーメソッド(locationToIndex(...)getCellBounds(...))を使用することができ、言ったのと同じように。

+1

良い説明のために+1 – basszero

+1

レンダリングされたコンポーネントをゴム印と考えてください。 –