2016-07-16 3 views
0

カスタムセルレンダラーは、フォームのようなオブジェクトのプロパティを定義できますか?カスタムセルレンダラーは、フォームのようなオブジェクトのプロパティを定義できますか?

私はJListの要素を定義する方法を探していました。単なる情報列ではなく、オブジェクトの現在の状態を反映しています。テキストの代わりに、ラジオボタン、テキストボックス、ラベルなどを使用します。テンプレートのようなあらかじめフォーマットされた方法で。

リストに表示する必要があるアイテムは、シフトのタイムスロットです。開始時間と終了時間、さまざまなブール値のプロパティを表します。コンポーネントを使用して各オブジェクトの状態を示すことができれば誰かが選択できるようにする方が良いでしょう。選択されたときに、リストではなくリストの下で編集が行われます。ちょうど表示のために。このような

何か:ちょうどセルレンダリングから関連JPanelインスタンスを返す:

http://i.stack.imgur.com/3MoeQ.png

+1

セルレンダラ/エディタは、テキストだけでなく、使用したい視覚化を使用できます。あなたは特定の質問がありますか? – MeBigFatGuy

答えて

2

あなたが望むすべてがには、その後、問題はない、JTableのセル内に Swingコンポーネントをレンダリングしている場合。しかし、内容を完全に対話可能にしたい場合は、問題にぶつかる可能性があります。JPanel (参考のため、およびJTableJListパネルアイテムをレンダリングするセルレンダラーのみから返さ使用:

問題は、本質的に、これです。レンダリングが完了すると、インスタンスは破棄されます。つまり、セルレンダラーから返されたコンポーネントの1つの状態を外部的に変更することはできず、テーブル内でそのコンポーネントが更新されることを期待することができます。

しかし、ユーザーがセルをクリックすると、リストが編集モードに入り、その時点でユーザーによって編集されているセルに実際にスイングコンポーネントの実際のインスタンスが含まれているため、それらのレンダリングだけではありません。

私は、このようなタスクにカスタムレイアウトマネージャを使用する方が一般的に優れていることが分かりました。例:

static class ListLayout implements LayoutManager { 
    private final int myItemHeight; 

    public ListLayout(int itemHeight) { 
     myItemHeight = itemHeight; 
    } 

    @Override 
    public void addLayoutComponent(String name, Component comp) { 
    } 

    @Override 
    public void removeLayoutComponent(Component comp) { 
    } 

    public Dimension preferredLayoutSize(Container parent) { 
     int h = 0; 
     int w = 0; 
     for (Component c : parent.getComponents()) { 
      h += c.getPreferredSize().height; 
      w = Math.max(w, c.getPreferredSize().width); 
     } 
     return new Dimension(w, h); 
    } 

    public Dimension minimumLayoutSize(Container parent) { 
     int w = 0; 
     for (Component c : parent.getComponents()) { 
      w = Math.max(w, c.getMinimumSize().width); 
     } 
     return new Dimension(w, 0); 
    } 

    public void layoutContainer(Container parent) { 
     int y = 0; 
     // Note: should really deal with parent's border insets here as well 
     // Additionally, can add fields like padding, margin, etc. to make this 
     // class more generally useful 
     for (Component c : parent.getComponents()) { 
      c.setBounds(0, y, parent.getWidth(), myItemHeight); 
      y += myItemHeight; 
     } 
    } 
} 

そして、呼び出し元のコード:もちろん

JFrame frame = new JFrame(); 
    JPanel content = new JPanel(); 
    content.setLayout(new ListLayout(25)); 
    JScrollPane scroll = new JScrollPane(content); 

    for (int i = 0; i < 20; ++i) { 
     content.add(new JButton(Integer.toString(i))); 
    } 

    frame.setContentPane(scroll); 
    frame.pack(); 
    frame.setVisible(true); 

、それをすべてが正確に何に依存しますので、あなたが選択hilighting、などのようなJListの追加機能を失わないこの方法をやってやってみたいです。ただし、上記のように、リスト形式のレイアウトで完全に相互作用可能なコンポーネントを提供します。

関連する問題