TITLE:JTableのCellRendererにJComboBoxを設定

Posted by aterai at 2007-03-19

JTableのCellRendererにJComboBoxを設定

JTableのCellRendererとしてJComboBoxを使用します。

  • &jnlp;
  • &jar;
  • &zip;
ComboCellRenderer.png

サンプルコード

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;
  }
}

解説

上記のサンプルでは、1列目(中央)のセルの表示をJComboBoxにするために、これを継承するセルレンダラーを設定しています。1列目はセルエディタもJComboBoxですが、これらは同じJComboBoxのインスタンスではなく、別々に用意しています。

レンダラーで使用するJComboBoxは、セルの表示のみに使用するため、以下のように設定しています。

  • 表示用のアイテム(文字列)を一つだけ持つ
  • 編集可にしてEditorComponentの背景色などを他のセルと同様になるように変更
  • セル内にきれいに収まるように余白を0に設定

参考リンク

コメント

  • セルの幅を大きくするとセルの表示が消えますが・・・これは一体なんでしょうか? -- ichikawa
    • ご指摘ありがとうございます。リサイズなどでセルの表示がおかしくなるのは、バグです。DefaultTableCellRenderer#invalidate()などと同じ(パフォーマンス上の理由)にするため、何もしないようにオーバーライドした、テスト中のコードとサンプルをアップロードしていました。 -- aterai