在JTable中使用TAB键切换到下一个组件

11

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

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

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

但它仍然没有将焦点改变到下一个组件!
我该如何使JTable将焦点改变到下一个组件而不是下一个单元格?


我们在谈论什么焦点?1)在JTable单元格之间,2)在JTable和(例如)JTextField之间移动焦点。 - mKorbel
@mKorbel:#2,JTable的默认行为是将焦点更改到下一个单元格,我想强制它在按TAB键时将焦点移动到下一个组件(例如JTextField)。 - Ariyan
4个回答

15

默认情况下,Shift+/Tab键用于在组件之间转移焦点。JTable明确请求通过提供一组不包括它们的focusTraversalKeys来处理shift-/tab键。

按照通用规则(如果有专门的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);

7
如果您真的想要这个,您需要更改表行为映射的默认行为。
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();
    }
}

另一种方法是禁用基础的Action...
ActionMap am = table.getActionMap();
am.get("selectPreviousColumnCell").setEnabled(false);
am.get("selectNextColumnCell").setEnabled(false);

(未测试过)

这种方法的好处是可以根据需要启用/禁用行为,而不需要维护对旧Actions的引用。


键盘焦点管理器?本来想提到Component.transferFocusXXX(),但是有4个月没用了:P - MadProgrammer

5
  • 默认情况下(实现了JTableKeyBinding),光标会在下一个单元格和从最后一个单元格到第一个单元格之间移动。

  • 您可以通过将其设置为null值来删除KeyBindings,具体方法请参考此处


4

要将键盘绑定重置为标准设置(通常为TAB和SHIFT+TAB),只需将keystrokes参数指定为null,并将其传递给Component.setFocusTraversalKeys

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接