概要

JTableの任意の列でマウスクリックなどによる選択ができないように制限します。

サンプルコード

JTable table = new JTable(model) {
  private boolean isColumnSelectable(int column) {
    return convertColumnIndexToModel(column) == 0;
  }

  @Override public void changeSelection(
      int rowIndex, int columnIndex, boolean toggle, boolean extend) {
    if (!isColumnSelectable(columnIndex)) {
      return;
    }
    super.changeSelection(rowIndex, columnIndex, toggle, extend);
  }

  @Override public boolean isCellEditable(int row, int column) {
    return isColumnSelectable(column);
  }

  @Override public Component prepareRenderer(
      TableCellRenderer renderer, int row, int column) {
    if (isColumnSelectable(column)) {
      return super.prepareRenderer(renderer, row, column);
    } else {
      return renderer.getTableCellRendererComponent(
          this, getValueAt(row, column), false, false, row, column);
    }
  }
};
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、第0列目のみ選択・編集可能に設定し、残りの列はマウスクリックやカーソル移動などで選択できないようJTable#changeSelection(...)JTable#changeSelection(...)メソッドをオーバーライドしています。

  • JTable#isCellEditable(...)メソッドをオーバーライドして編集不可に設定
    • 選択不可で編集可能な列も設定可能
  • JTable#prepareRenderer(...)メソッドをオーバーライドして列を並べ替えたときにフォーカスが選択不可の列に移動しないよう設定
    • table.getTableHeader().setReorderingAllowed(false)などで列の並べ替えを禁止している場合は不要
  • table.putClientProperty("Table.isFileList", Boolean.TRUE);で、第0列目の文字列のみ選択可能になる

参考リンク

コメント