2011-01-06 5 views
3

複数のJPanelを表示するJListがあります。新しいJPanelを返すカスタムレンダラを作成しました。 JPanelはJListに表示されていますが、アクセスできない、選択できません。ボタンやテキストエリアがあれば、それを押すことはできません。 これはJListで動作するかどうか試してみたいのですが、これはさらにページ番号を付けたいからです。私はJscrollペインにパネルを追加することでそれを動作させることができましたが、JListを機能させることが大好きです。カスタムレンダラを使用したJList

おかげ

答えて

10

これはJList(およびJTabelJComboBoxなど)の通常の動作です。

カスタムレンダラから返されるJPanelは、Swing階層に追加されません。 JListでは、paintメソッドのみが使用され、適切な場所にレンダラーを描画します。レンダラーはスタンプとして機能し、JListに表示されるのはコンポーネントではなく、コンポーネントのイメージです。

これは、実際にインスタンス化されたコンポーネントのオーバーヘッドを伴わずに、多くのコンポーネントを画面に表示する効率的な方法です。レンダラーは常に同じインスタンスを返すことができます(さらに好ましいことです)。

詳細については、Swing tutorialを参照してください。

JListのエントリを実際のコンポーネントのように動作させるには、次の操作を行います。まず、JListの代わりにJTableを使用します。 1つの列およびヘッダーを持たないJTableは、JListとおおよそ同じです。 JTableを使用する理由JTableは編集者を提供するためです。編集者は、レンダラーのようにJTableに登録されています。エディタは、一般に、ユーザがJTableのセルをクリックすると表示されます。エディタはレンダラに重ねられ、今回は実際のコンポーネントです。レンダラーコンポーネントとエディターコンポーネントが同一である場合、ユーザーはJTableのセルが実際のコンポーネントであると感じます。

Swing tutorialにこの手法の例があります。

+1

ありがとう.. – AhmadAssaf

+1

非常に明確で簡潔な私が探してきましたJListと同様の問題でGoogleを何時間も使用しています。この1つの投稿はすべて私の質問に答えるだけでなく、後にポップアップするものもありました。うまくやった! – Genzume

0

私はそれらを選択カントと私はそれでボタンやテキスト領域を持っている場合、私は、レンダラがコンポーネントの単なる絵である

それを押すことができません。実際のコンポーネントではないので、ボタンをクリックしたり、テキスト領域にテキストを入力することはできません。

これには実際のコンポーネントを使用する必要があります。したがって、コンポーネントを使用してカスタムパネルを作成し、そのパネルをスクロールペインに追加された別のパネルに追加する方がよいでしょう。

+0

またはちょうど1列でJTableのを使用し、カスタムレンダリング/エディタを作成:) – willcodejavaforfood

0

ここに私のソリューションです:

public class AccountRenderer extends DefaultListCellRenderer { 

private static final long serialVersionUID = 1L; 

@Override 
public Component getListCellRendererComponent(JList list, Object value, 
     int index, boolean isSelected, boolean cellHasFocus) { 
    JLabel renderer = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
    if (value != null) { 
     Account entry = (Account) value; 
     renderer.setText(entry.getName()); 
    } 
    return renderer; 
} 

}

関連する問題