JTableのセルエディタ内でタブキーによるフォーカス移動を有効にする
Total: 2946
, Today: 1
, Yesterday: 0
Posted by aterai at
Last-modified:
概要
JTable
が編集中の場合はセルエディタ内でタブキーによるフォーカス移動が可能になるよう設定します。
Screenshot
Advertisement
サンプルコード
JTable table = makeTable();
ActionMap am = table.getActionMap();
Action sncc = am.get("selectNextColumnCell");
Action action = new AbstractAction() {
@Override public void actionPerformed(ActionEvent e) {
if (!table.isEditing() || !isEditorFocusCycle(table.getEditorComponent())) {
// System.out.println("Exit editor");
sncc.actionPerformed(e);
}
}
};
am.put("selectNextColumnCell2", action);
InputMap im = table.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), "selectNextColumnCell2");
// ...
protected boolean isEditorFocusCycle(Component editor) {
Component child = CheckBoxesEditor.getEditorFocusCycleAfter(editor);
if (child != null) {
child.requestFocus();
return true;
}
return false;
}
// ...
public static Component getEditorFocusCycleAfter(Component editor) {
Component fo = KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner();
if (fo == null || !(editor instanceof Container)) {
return null;
}
Container root = (Container) editor;
if (!root.isFocusCycleRoot()) {
root = root.getFocusCycleRootAncestor();
}
if (root == null) {
return null;
}
// System.out.println("FocusCycleRoot: " + root.getClass().getName());
FocusTraversalPolicy ftp = root.getFocusTraversalPolicy();
Component child = ftp.getComponentAfter(root, fo);
if (child != null && SwingUtilities.isDescendingFrom(child, editor)) {
// System.out.println("requestFocus: " + child.getClass().getName());
// child.requestFocus();
return child;
}
return null;
}
View in GitHub: Java, Kotlin解説
- 上: デフォルトの
JTable
KeyEvent.VK_TAB
にはselectNextColumnCell
アクションが割り当てられており、このアクションはtable.getCellEditor().stopCellEditing()
メソッドで編集を中断して次のセルを選択する
- 下:
selectNextColumnCell
アクションを置換- セルエディタが複数の子コンポーネントを持つ
FocusCycleRoot
コンポーネントであり、そのセルが編集中の場合はFocusTraversalPolicy
を取得してセル内でフォーカス移動、編集中でない場合はselectNextColumnCell
アクションを実行するアクションを作成して、KeyEvent.VK_TAB
に割り当てる - このサンプルではShift+Tabでの逆順フォーカス移動には対応していないので、セル編集が中断されて前のセルにフォーカスが移動する
- セルエディタが複数の子コンポーネントを持つ