6

JList のカスタム セル レンダラーを作成するときはいつでも、それに追加する要素がアクションに応答しません。たとえば、セル レンダラーが要素を含む JPanel を返すようにした場合、そのうちの 1 つに ActionListener があり、まったく応答しません。

どうしてこれなの?

4

2 に答える 2

11

レンダラーは、セルのコンポーネントを返すためのファクトリのように見えるかもしれませんが、実際にはflyweight レンダリングアプローチに従い、すべてのセルをレンダリングするために同じコンポーネントを使用します (への各呼び出しgetListCellRendererComponent()は、特定のセルに対して同じコンポーネント インスタンスを再構成し、セルをレンダリングできるようにそれを返します)。

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

Neil Coffey が言ったように、代わりにリスナーをJList( JTable, JTree) に追加し、ヘルパー メソッド ( locationToIndex(...), getCellBounds(...)) を使用して、影響を受けたセルをディスパッチし、セル固有のロジックを処理することができます。

于 2009-04-14T08:02:44.180 に答える
6

リスト セル レンダラーとして返すアイテムは、まさにそのためのものです:レンダリング. リスナーを JList に登録します (通常、ListSelectionListener が必要です)。

于 2009-04-13T04:42:23.703 に答える