首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在JTable组件上按Tabbing键

在JTable组件上按Tabbing键
EN

Stack Overflow用户
提问于 2009-07-09 14:20:40
回答 2查看 6.2K关注 0票数 3

我有一个包含许多组件的面板,其中一个是JTable。当JTable具有焦点并按下Tab键时,默认行为是将焦点从一个单元格移动到另一个单元格。我需要改变这一点,以便专注于下一个组件,即完全离开JTable

Ctrl-TAB可以达到预期效果,但用户不能接受。我可以向表中添加一个键侦听器,并在按下Tab键时更改焦点,但感觉似乎有更好的方法来实现这一点。

有什么想法吗?

谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-09 16:20:08

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

我将其称为“包装操作”,您可以通过查看Table Tabbing操作来找到此操作的示例。您应该能够轻松地自定义代码,以便使用KeyboardFocusManager转移焦点。

票数 1
EN

Stack Overflow用户

发布于 2009-07-09 15:08:26

通常,您可以通过将Action添加到组件操作映射中,然后在组件的输入映射中使用它绑定击键(下面的示例代码)来完成此操作。但是,这不适用于Tab键,因为此事件由焦点子系统使用,除非您添加以下行以删除Tab键作为焦点遍历键:

代码语言:javascript
复制
tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet());

下面是完整的示例代码:

代码语言:javascript
复制
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);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1104195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档