【问题标题】:Java Swing JMenuItem intercepts its accelerator key even entered into a JTextField componentJava Swing JMenuItem 拦截其加速键,甚至输入到 JTextField 组件中
【发布时间】:2014-06-12 15:18:50
【问题描述】:

示例代码:

public class FrameMenuTextFieldTest {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame frame = new JFrame();
                frame.getContentPane().add(new JTextField());
                JMenuBar menubar = new JMenuBar();
                JMenu menu = new JMenu("Menu");
                JMenuItem item = new JMenuItem("Item1");
                item.addActionListener(new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        JOptionPane.showMessageDialog(frame, "Menu Item clicked");
                    }
                });
                item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_5, 0));
                menu.add(item);
                menubar.add(menu);
                frame.setJMenuBar(menubar);
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.pack();
                frame.setVisible(true);
            }
        });
    }

}

这里的问题是,如果我在文本字段中输入5,不仅文本字段会收到此事件,菜单项也会收到此事件,并执行其操作;显示消息。

禁用按键事件传播到菜单栏的最简单方法是什么?

我是我的真实应用程序,我有很多菜单项要针对一些文本字段禁用。

【问题讨论】:

  • 我认为不使用任何修饰符是不可能的。您能否在帖子中指定您不想使用任何修饰符。以便您得到正确的答案。
  • 即使你指定了一个修饰符,例如SHIFT+5,然后在文本字段中输入SHIFT+5,菜单项的动作将被执行。
  • 我已经编辑了我的帖子。

标签: java swing jtextfield jmenuitem jmenubar


【解决方案1】:

JMenuItem 与一些修饰符绑定,例如Ctrl、Alt、Shift 等。如果可能,如KeyStroke#getKeyStroke() 所述。

尝试如下所示将其与Ctrl+5 绑定。

item.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_5, InputEvent.CTRL_DOWN_MASK));

编辑

如果您不想使用任何修饰符,它可能会对您有所帮助。

如果当前可聚焦组件不是JTextField,则对JMenuItem 执行操作。

示例代码:

JMenuItem item = new JMenuItem("Item1");
item.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        Component component = frame.getFocusOwner();
        if (!(component instanceof JTextField)) {
            JOptionPane.showMessageDialog(frame, "Menu Item clicked");
        }
    }
});

In Swing, how can I find out what object currently has focus? 上阅读更多信息

【讨论】:

  • 帖子有任何严重问题。请留下 cmets 以便我学习。
  • 抱歉,这不是解决方案:我不想要 CTRL,我只想要 5 作为加速器。此外,如果我在文本字段内按 CTRL+5,也会显示该消息。
  • 好吧,如果可能的话让我试试。
  • 谢谢,好主意!我还在等待一点点,也许可以为菜单或菜单栏中的所有菜单项提供一个全局解决方案,因为我有很多项目,而且一个一个地做这件事会很糟糕。
  • 太棒了!在过去一个小时我一直把头撞在墙上之后,你的修复对我有用!
猜你喜欢
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 1970-01-01
  • 2014-05-26
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
相关资源
最近更新 更多