Code
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;
}
References