2012/01/03

JTableのセルを活殺制御する方法について

JTableのセルを活殺制御する方法に関するメモ。

JTableのMouseListner、PropertyChangeListenerを以下のように実装したら何とかできた。

private void tbl_listPropertyChange(java.beans.PropertyChangeEvent evt) {                                        

        int row = tbl_list.getSelectedRow();
        if (row != -1) {
            for (int col = 1; col < tbl_list.getColumnCount(); col++) {
                Object val = tbl_list.getValueAt(row, col); // (1)
                TableCellEditor editor = tbl_list.getCellEditor(row, col); // (2)
                Component comp = editor.getTableCellEditorComponent(tbl_list, val, true, row, col); // (3)
                comp.setEnabled(!machineList.get(row).getDeleteFlag()); // (4)
            }
        }
    }

    private void tbl_listMouseClicked(java.awt.event.MouseEvent evt) {

        int row = tbl_list.rowAtPoint(evt.getPoint());
        int col = tbl_list.columnAtPoint(evt.getPoint());

        tbl_list.changeSelection(row, col, false, false); // 5)
    }
1)セルに設定されている値を取得する。
2)セルに設定されているエディターを取得する
3)エディターに設定されているコンポーネントを取得する。取得時に初期値として変更前の値を取得する
4)コンポーネントを活殺制御する。

5)マウスがクリックされた位置に確実にフォーカスを移動させる。
これをしないと編集中に別セルをダブルクリックした際に正常にフォーカス移動しない。

なお、セルにコンボボックスを使用する場合、DafaultCellEditorを以下のように初期化すること。

dCellEditor = new DefaultCellEditor(cmb_seizo_moto);
dCellEditor.setClickCountToStart(2); // (1)
(1)セルエディタの起動する回数を2回に変更する。