これはJList
(およびJTabel
、JComboBox
など)の通常の動作です。
カスタムレンダラから返されるJPanel
は、Swing階層に追加されません。 JList
では、paint
メソッドのみが使用され、適切な場所にレンダラーを描画します。レンダラーはスタンプとして機能し、JList
に表示されるのはコンポーネントではなく、コンポーネントのイメージです。
これは、実際にインスタンス化されたコンポーネントのオーバーヘッドを伴わずに、多くのコンポーネントを画面に表示する効率的な方法です。レンダラーは常に同じインスタンスを返すことができます(さらに好ましいことです)。
詳細については、Swing tutorialを参照してください。
JList
のエントリを実際のコンポーネントのように動作させるには、次の操作を行います。まず、JList
の代わりにJTable
を使用します。 1つの列およびヘッダーを持たないJTable
は、JList
とおおよそ同じです。 JTable
を使用する理由JTable
は編集者を提供するためです。編集者は、レンダラーのようにJTable
に登録されています。エディタは、一般に、ユーザがJTableのセルをクリックすると表示されます。エディタはレンダラに重ねられ、今回は実際のコンポーネントです。レンダラーコンポーネントとエディターコンポーネントが同一である場合、ユーザーはJTableのセルが実際のコンポーネントであると感じます。
Swing tutorialにこの手法の例があります。
ありがとう.. – AhmadAssaf
非常に明確で簡潔な私が探してきましたJListと同様の問題でGoogleを何時間も使用しています。この1つの投稿はすべて私の質問に答えるだけでなく、後にポップアップするものもありました。うまくやった! – Genzume