Java 使用选项卡将焦点更改为JTable中的下一个组件

Java 使用选项卡将焦点更改为JTable中的下一个组件,java,swing,focus,jtable,focusmanager,Java,Swing,Focus,Jtable,Focusmanager,JTable的默认行为是将焦点更改为下一个单元格,我想强制它在按下TAB键时将焦点移动到下一个组件(例如JTextField)。 我覆盖了isCellEditable方法的DefaultTableModel以始终返回false: public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } 但它仍然不会将焦点转移到下一个组件 如何使JTable将焦点更改为下一个组件而不是下一个单元格 默认

JTable的默认行为是将焦点更改为下一个单元格,我想强制它在按下TAB键时将焦点移动到下一个组件(例如JTextField)。
我覆盖了
isCellEditable
方法的
DefaultTableModel
以始终返回false:

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
}
但它仍然不会将焦点转移到下一个组件
如何使
JTable
将焦点更改为下一个组件而不是下一个单元格

  • 默认值(为
    JTable
    实现的
    KeyBinding
    )是关于下一个单元格以及从最后一个单元格到第一个单元格

  • 你可以


如果确实需要,则需要更改表操作映射的默认行为

ActionMap am = table.getActionMap();
am.put("selectPreviousColumnCell", new PreviousFocusHandler());    
am.put("selectNextColumnCell", new NextFocusHandler());    
然后您需要几个操作来处理遍历

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();
    }
}
另一种方法是禁用底层的
操作

ActionMap am = table.getActionMap();
am.get("selectPreviousColumnCell").setEnabled(false);
am.get("selectNextColumnCell").setEnabled(false);
(尚未对此进行测试)


这种方法的好处是可以根据需要启用/禁用行为,而无需维护对旧
操作的引用,默认情况下,shift-/tab键用于在组件之间转移焦点。JTable显式地请求在内部处理shift-/tab(通过提供不包括这些内容的FocusTraversalkey集)

按照一般规则(如果任务有特定的api可用,请使用该api而不是滚动自己的api),解决方案是设置遍历键以再次包含它们:

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);
Set forward=新哈希集(
表.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
add(KeyStroke.getKeyStroke(“TAB”));
表.setFocusTraversalKeys(KeyboardFocusManager.FORWARD\u TRAVERSAL\u KEYS,FORWARD);
向后设置=新哈希集(
表.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
backward.add(击键.getKeyStroke(“shift选项卡”));
表.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD\u遍历键,BACKWARD);

要重置为标准键盘绑定(通常为TAB和SHIFT+TAB),只需为
按键
组件的
参数指定
null
。setFocusTraversalKeys

table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);

我们是不是在谈论焦点1)在单元之间的JTable内部2)将焦点从JTable移动到(例如)JTextField,反之亦然versa@mKorbel:#2,JTable的默认行为是将焦点更改为下一个单元格,我想强制它在按下TAB键时将焦点移动到下一个组件(例如,
JTextField
)。?键盘焦点管理器?我打算提到Componet.transferFocusXXX(),但有4个月的时间来打嗝:PYep,我不知道这件事。