Search code examples
javaswingfocusjtablefocusmanager

Change focus to next component in JTable using TAB


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 isCellEditable method of DefaultTableModel to always return false:

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
}

But it still doesn't change focus to next component!
How should I make JTable change focus to next component instead of next cell?


Solution

  • 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