概要

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 all

解説

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

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

参考リンク

コメント