概要

JTableCellRendererとしてJComboBoxを使用します。

サンプルコード

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

  @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;
  }
}
View in GitHub: Java, Kotlin

解説

  • 1列目(中央)のセルの表示をJComboBoxにするために、これを継承するセルレンダラーを設定
    • この列のセルエディタもJComboBoxを使用するが、セルレンダラーとは別のJComboBoxのインスタンスを設定
  • セルレンダラーとして使用するJComboBoxはセルの表示のみに使用するため、以下のように設定
    • 表示用のアイテム(文字列)を一つだけ持つ
    • 編集可にしてEditorComponentの背景色などを他のセルと同様になるように変更
    • セル内にきれいに収まるように余白を0に設定

参考リンク

コメント