Swing/ComboCellRenderer のバックアップの現在との差分(No.1)
TITLE:JTableのCellRendererにJComboBoxを設定
JTableのCellRendererにJComboBoxを設定
編集者:Terai Atsuhiro~
作成日:2007-03-19
更新日:2024-03-14 (木) 12:16:03
概要
JTable
のCellRenderer
としてJComboBox
を使用します。
Screenshot
Advertisement
概要
JTableのCellRendererとしてJComboBoxを使用します。サンプルコード
#spanend
#spanadd
class ComboCellRenderer extends JComboBox implements TableCellRenderer {
#spanend
private static final Color ec = new Color(240, 240, 255);
private final JTextField editor;
public ComboCellRenderer() {
super();
setEditable(true);
setBorder(BorderFactory.createEmptyBorder());
#spandel
#screenshot
#spanend
editor = (JTextField) getEditor().getEditorComponent();
editor.setBorder(BorderFactory.createEmptyBorder());
editor.setOpaque(true);
}
#spandel
**サンプルコード [#l43fa315]
#spanend
#spandel
#code{{
#spanend
class ComboCellRenderer extends JComboBox implements TableCellRenderer {
private static final Color ec = new Color(240, 240, 255);
private final JTextField editor;
public ComboCellRenderer() {
super();
setEditable(true);
setBorder(BorderFactory.createEmptyBorder());
editor = (JTextField) getEditor().getEditorComponent();
editor.setBorder(BorderFactory.createEmptyBorder());
editor.setOpaque(true);
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
removeAllItems();
if(isSelected) {
editor.setForeground(table.getSelectionForeground());
editor.setBackground(table.getSelectionBackground());
}else{
editor.setForeground(table.getForeground());
editor.setBackground((row%2==0)?ec:table.getBackground());
}
addItem((value==null)?"":value.toString());
return this;
}
}
@Override public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected, boolean hasFocus,
int row, int column) {
removeAllItems();
if (isSelected) {
editor.setForeground(table.getSelectionForeground());
editor.setBackground(table.getSelectionBackground());
} else {
editor.setForeground(table.getForeground());
editor.setBackground((row % 2 == 0) ? ec : table.getBackground());
}
addItem(Objects.toString(value, ""));
return this;
}
#spanadd
}
#spanend
View in GitHub: Java, Kotlin- &jnlp;
- &jar;
- &zip;
解説
上記のサンプルでは、1列目のセルの表示をJComboBoxにするために、これを継承するセルレンダラーを設定しています。1列目はセルエディタもJComboBoxですが、これらは別々のインスタンスです。解説
-
1
列目(中央)のセルの表示をJComboBox
にするために、これを継承するセルレンダラーを設定- この列のセルエディタも
JComboBox
を使用するが、セルレンダラーとは別のJComboBox
のインスタンスを設定
- この列のセルエディタも
- セルレンダラーとして使用する
JComboBox
はセルの表示のみに使用するため、以下のように設定- 表示用のアイテム(文字列)を一つだけ持つ
- 編集可にして
EditorComponent
の背景色などを他のセルと同様になるように変更 - セル内にきれいに収まるように余白を
0
に設定
- 表示用のアイテム(文字列)を一つだけ持つ
- 編集可にしてEditorComponentの背景色などを他のセルと同様になるように変更
- セル内にきれいに収まるように余白を0に設定
参考リンク
参考リンク
コメント
- セルの幅を大きくするとセルの表示が消えますが・・・これは一体なんでしょうか? -- ichikawa
- ご指摘ありがとうございます。リサイズなどでセルの表示がおかしくなるのは、バグです。
DefaultTableCellRenderer#invalidate()
などと同じ(パフォーマンス上の理由)にするため、何もしないようにオーバーライドした、テスト中のコードとサンプルを誤ってアップロードしていました。 -- aterai
- ご指摘ありがとうございます。リサイズなどでセルの表示がおかしくなるのは、バグです。