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

JDK 6 で導入された、TableRowSorterを使っている場合は、ソート不可にするカラムをDefaultRowSorter#setSortable(int, boolean)で指定し、表示はたとえば以下のようなレンダラーで切り替えます(参考:TableRowSorterでJTableのソート)。

final JTableHeader hd = table.getTableHeader();
final TableCellRenderer headerRenderer = hd.getDefaultRenderer();
hd.setDefaultRenderer(new TableCellRenderer() {
  public Component getTableCellRendererComponent(JTable tbl, Object val,
      boolean isS, boolean hasF, int row, int col) {
  JLabel lbl = (JLabel)headerRenderer.getTableCellRendererComponent(
    tbl, val, isS, hasF, row, col);
  int modelColumnIndex = tbl.convertColumnIndexToModel(col);
  lbl.setForeground(sorter.isSortable(modelColumnIndex)?Color.BLACK:Color.GRAY);
  return lbl;
  }
});

コメント