あなたが望むすべてがには、その後、問題はない、JTableのセル内に Swingコンポーネントをレンダリングしている場合。しかし、内容を完全に対話可能にしたい場合は、問題にぶつかる可能性があります。JPanel
(参考のため、およびJTable
)JList
パネルアイテムをレンダリングするセルレンダラーのみから返さ使用:
問題は、本質的に、これです。レンダリングが完了すると、インスタンスは破棄されます。つまり、セルレンダラーから返されたコンポーネントの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
の追加機能を失わないこの方法をやってやってみたいです。ただし、上記のように、リスト形式のレイアウトで完全に相互作用可能なコンポーネントを提供します。
セルレンダラ/エディタは、テキストだけでなく、使用したい視覚化を使用できます。あなたは特定の質問がありますか? – MeBigFatGuy