JList のカスタム セル レンダラーを作成するときはいつでも、それに追加する要素がアクションに応答しません。たとえば、セル レンダラーが要素を含む JPanel を返すようにした場合、そのうちの 1 つに ActionListener があり、まったく応答しません。
どうしてこれなの?
JList のカスタム セル レンダラーを作成するときはいつでも、それに追加する要素がアクションに応答しません。たとえば、セル レンダラーが要素を含む JPanel を返すようにした場合、そのうちの 1 つに ActionListener があり、まったく応答しません。
どうしてこれなの?
レンダラーは、セルのコンポーネントを返すためのファクトリのように見えるかもしれませんが、実際にはflyweight レンダリングアプローチに従い、すべてのセルをレンダリングするために同じコンポーネントを使用します (への各呼び出しgetListCellRendererComponent()
は、特定のセルに対して同じコンポーネント インスタンスを再構成し、セルをレンダリングできるようにそれを返します)。
そうすれば、各セルのコンポーネントをインスタンス化することなく、大量のセルをJList
(および と同様JTable
に) 表示できます。JTree
副作用として、レンダー コンポーネントはイベントに応答できません。これは、レンダー ループ中にのみ使用され、コンポーネント ツリーには表示されないためです。
Neil Coffey が言ったように、代わりにリスナーをJList
( JTable
, JTree
) に追加し、ヘルパー メソッド ( locationToIndex(...)
, getCellBounds(...)
) を使用して、影響を受けたセルをディスパッチし、セル固有のロジックを処理することができます。
リスト セル レンダラーとして返すアイテムは、まさにそのためのものです:レンダリング. リスナーを JList に登録します (通常、ListSelectionListener が必要です)。