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