Swing/CellEditorFocusCycle のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/CellEditorFocusCycle へ行く。
- 1 (2019-03-25 (月) 17:26:34)
- 2 (2019-07-30 (火) 13:51:18)
- 3 (2021-03-25 (木) 14:11:35)
- category: swing folder: CellEditorFocusCycle title: JTableのセルエディタ内でタブキーによるフォーカス移動を有効にする tags: [JTable, TableCellEditor, Focus, FocusTraversalPolicy] author: aterai pubdate: 2019-03-25T17:24:54+09:00 description: JTableが編集中の場合はセルエディタ内でタブキーによるフォーカス移動が可能になるよう設定します。 image: https://drive.google.com/uc?id=1m3-6T_FyHa51fARDyoZ92MJKfAVox1HjjQ
概要
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
アクションを置換- セルが編集中の場合は
FocusTraversalPolicy
を取得してセル内でフォーカス移動、編集中でない場合はselectNextColumnCell
アクションを実行するアクションを作成して、KeyEvent.VK_TAB
に割り当て - このサンプルではShift+Tabでの逆順フォーカス移動には対応していないので、編集が中断されて前のセルにフォーカスが移動する
- セルが編集中の場合は