在JTable组件上进行Tab切换

3
我有一个包含多个组件的面板,其中之一是 JTable。当 JTable 获得焦点并按下 TAB 键时,默认行为是在表格中单元格之间移动焦点。我需要更改这个行为,让它将焦点放在下一个组件上,即完全离开 JTable

Ctrl-TAB 可以实现所需结果,但对用户来说不可接受。我可以向表格添加键盘监听器,并在按下 TAB 时更改焦点,但感觉可能有更好的方法。

有什么想法吗?

谢谢...


我认为正确的解决方案已经发布在这里:https://dev59.com/fmct5IYBdhLWcg3wWMJF#12157344 - DDD
2个回答

4
通常,您可以通过向组件的操作映射添加一个Action,然后在组件的输入映射中绑定一个按键来完成此操作(示例代码如下)。 但是,这对于Tab键不起作用,因为该事件被焦点子系统消耗,除非您添加以下行以将Tab键移除为焦点遍历键:
tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());

以下是完整的示例代码:

public static void main(String[] args) {
    final JTabbedPane tp = new JTabbedPane();

    // Remove Tab as the focus traversal key - Could always add another key stroke here instead.
    tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());

    KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);

    Action nextTab = new AbstractAction("NextTab") {
        public void actionPerformed(ActionEvent evt) {
            int i = tp.getSelectedIndex();
            tp.setSelectedIndex(i == tp.getTabCount() - 1 ? 0 : i + 1);
        }
    };

    // Register action.
    tp.getActionMap().put("NextTab", nextTab);
    tp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, "NextTab");

    tp.addTab("Foo", new JPanel());
    tp.addTab("Bar", new JPanel());
    tp.addTab("Baz", new JPanel());
    tp.addTab("Qux", new JPanel());

    JFrame frm = new JFrame();

    frm.setLayout(new BorderLayout());
    frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frm.add(new JButton(nextTab), BorderLayout.NORTH);
    frm.add(tp, BorderLayout.CENTER);
    frm.setBounds(50,50,400,300);
    frm.setVisible(true);
}

那正是我需要的提示。一直想不通为什么TAB键无法使用,但我有一个想法,可能是因为焦点策略的原因。 - Tony Eichelberger

1

你可能不想完全取消 Tab 操作,因为它还有其他职责。例如,在编辑单元格时,Tab 操作会在移动到下一个单元格之前停止单元格编辑。因此,您可能希望保留此行为,同时添加额外的行为以将焦点更改为下一个组件。

我称之为“包装操作”,您可以通过查看 表格切换选项卡 操作来找到示例。您应该能够轻松定制代码,使用 KeyboardFocusManager 来传输焦点。


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