概要

JTableの指定した列を編集は可能、ただし選択は不可になるよう設定します。

サンプルコード

JTable table1 = new JTable(model) {
  @Override public void changeSelection(
      int rowIndex, int columnIndex, boolean toggle, boolean extend) {
    if (convertColumnIndexToModel(columnIndex) != 0) {
      return;
    }
    super.changeSelection(rowIndex, columnIndex, toggle, extend);
  }

  @Override public Component prepareRenderer(
      TableCellRenderer renderer, int row, int column) {
    if (convertColumnIndexToModel(column) != 0) {
      return renderer.getTableCellRendererComponent(
          this, getValueAt(row, column), false, false, row, column);
    }
    return super.prepareRenderer(renderer, row, column);
  }

  //TEST:
  // @Override public Component prepareEditor(TableCellEditor editor, int row, int column) {
  //   Component c = super.prepareEditor(editor, row, column);
  //   c.setBackground(getBackground());
  //   return c;
  // }
};

JTable table2 = new JTable(model) {
  @Override public void changeSelection(
      int rowIndex, int columnIndex, boolean toggle, boolean extend) {
    if (convertColumnIndexToModel(columnIndex) != 0) {
      return;
    }
    super.changeSelection(rowIndex, columnIndex, toggle, extend);
  }
};
table2.setCellSelectionEnabled(true);
table2.getColumnModel().setSelectionModel(new DefaultListSelectionModel() {
  @Override public boolean isSelectedIndex(int index) {
    return table2.convertColumnIndexToModel(index) == 0;
  }
});
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、JTable#changeSelection(...)をオーバーライドするなどの方法で、0列目以外を編集は可能、ただし選択は不可となるように設定しています。

  • 上: Override JTable#prepareRenderer(...)
    • JTable#prepareRenderer(...)をオーバーライドし0列目以外は選択状態を描画しないように設定
    • Booleanのデフォルトセルエディタ(JCheckBox)の背景色を修正していないので、たとえばCtrl+Aで全セルを選択した後に選択不可のBooleanセルをクリックすると背景色が選択色に変化する場合がある
  • 下: table.setCellSelectionEnabled(true); + Override ListSelectionModel#isSelectedIndex(...)
    • カラムモデルにListSelectionModel#isSelectedIndex(...)をオーバーライドしたListSelectionModelを設定し0列目以外は選択されないように設定

参考リンク

コメント