TITLE:JTableHeaderのカラムを選択不可にする

JTableHeaderのカラムを選択不可にする

編集者:Terai Atsuhiro
作成日:2005-07-11
更新日:2024-01-09 (火) 07:40:40

概要

JTableHeaderのカラムを選択不可にして、ソートなどを禁止します。

#screenshot

サンプルコード

public class SortButtonRenderer extends JButton
                             implements TableCellRenderer{
  public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    JButton button = this;
    if(!isEnabledAt(column)) {
      button.setText((value ==null) ? "" : value.toString());
      button.getModel().setEnabled(false);
      return button;
    }
以下省略
private final HashMap dmap = new HashMap();
public boolean isEnabledAt(int col) {
  Integer oi = new Integer(col);
  if(dmap.containsKey(oi)) {
    Boolean b = (Boolean)dmap.get(oi);
    return b.booleanValue();
  }else{
    return true;
  }
}
  • &jnlp;
  • &jar;
  • &zip;

解説

サンプルでは、0列目のヘッダカラムを常に選択不可に、3列目はチェックボックスで選択できるかどうかを切り替えるようにしています。

HashMapに選択不可にするカラムヘッダを設定し、レンダラーがヘッダを描画するときにそれをsetEnabled(false)しています。

TableSorter.javaを使用してソートしている場合は、TableSorterのインナークラスのMouseHandler を、例えば以下のように変更すると、任意のカラムをクリックしてもソートされなくなります。

private class MouseHandler extends MouseAdapter {
  public void mouseClicked(MouseEvent e) {
    JTableHeader h = (JTableHeader) e.getSource();
    TableColumnModel columnModel = h.getColumnModel();
    int viewColumn = columnModel.getColumnIndexAtX(e.getX());
    int column = columnModel.getColumn(viewColumn).getModelIndex();
    // ここをちょっと変更
    if (isSortableIndex(column)) { //column != -1 ) {
      int status = getSortingStatus(column);
      if (!e.isControlDown()) {
        cancelSorting();
      }
      status = status + (e.isShiftDown() ? -1 : 1);
      status = (status + 4) % 3 - 1; // signed mod, returning {-1, 0, 1}
      setSortingStatus(column, status);
    }
  }
}

コメント