Change focus to next component in JTable using TAB

后端 未结 4 1886
一个人的身影
一个人的身影 2020-12-20 15:35

JTable\'s default behavior is changing focus to next cell and I want to force it to move focus to next component (e.g. JTextField) on TAB key pressed.
I overrided

相关标签:
4条回答
  • 2020-12-20 15:58
    • default (implemented KeyBinding for JTable) is about next cell and from last cell to first,

    • you can to remove KeyBindings by setting to the null value

    0 讨论(0)
  • 2020-12-20 16:01

    To reset to the standard keyboard bindings (typically TAB and SHIFT+TAB), simply specify null for the keystrokes parameter to Component.setFocusTraversalKeys:

    table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
    table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
    
    0 讨论(0)
  • 2020-12-20 16:10

    The shift-/tab keys are used by default for transfering focus between components. JTable explicitly requests to handle the shift-/tab internally (by providing sets of focusTraversalKeys which doesn't include those).

    Following the general rule (if there's specilized api available for a task, use that instead of rolling your own), the solution is to set traversal keys to again contain them:

    Set<AWTKeyStroke> forward = new HashSet<AWTKeyStroke>(
            table.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
    forward.add(KeyStroke.getKeyStroke("TAB"));
    table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward);
    Set<AWTKeyStroke> backward = new HashSet<AWTKeyStroke>(
            table.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
    backward.add(KeyStroke.getKeyStroke("shift TAB"));
    table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward);
    
    0 讨论(0)
  • 2020-12-20 16:14

    If you really want this, you need to change the default behavior of the tables action map.

    ActionMap am = table.getActionMap();
    am.put("selectPreviousColumnCell", new PreviousFocusHandler());    
    am.put("selectNextColumnCell", new NextFocusHandler());    
    

    Then you need a couple of actions to handle the traversal

    public class PreviousFocusHandler extends AbstractAction {
        public void actionPerformed(ActionEvent evt) {
            KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            manager.focusPreviousComponent();
        }
    }
    
    public class NextFocusHandler extends AbstractAction {
        public void actionPerformed(ActionEvent evt) {
            KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
            manager.focusNextComponent();
        }
    }
    

    Another approach would be to disable the underlying Action...

    ActionMap am = table.getActionMap();
    am.get("selectPreviousColumnCell").setEnabled(false);
    am.get("selectNextColumnCell").setEnabled(false);
    

    (haven't tested this)

    The benefit of this approach is can enable/disable the behaviour as you need it without needing to maintain a reference to the old Actions

    0 讨论(0)
提交回复
热议问题