JMenuItem - 如何判断加速器是否调用了动作?

时间:2013-04-23 18:25:48

标签: java swing jmenuitem

所以我必须在我的Java类的Swing中创建一个简单的GUI,我偶然发现了这个小问题。

我有以下代码:

    JMenuItem mntmQuit = new JMenuItem("Quit");
    mntmQuit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (e.getModifiers() == MouseEvent.BUTTON1_MASK) {
                System.out.println("You should fire.");
            } else if (e.getModifiers() == MouseEvent.BUTTON2_MASK || e.getModifiers() == MouseEvent.BUTTON3_MASK) {
                System.out.println("Why do you fire this event?");
            } else {
                System.out.println("And how can I catch when the accelerator was used?");
            }
        }
    });
    mntmQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0));

我从未见过右键单击或使用除按钮1之外的任何其他鼠标按钮时调用的菜单项。因为看起来Swing看到的方式不同并且无论按下哪个鼠标按钮都会发送动作事件 - 与此相反除非用鼠标按钮1单击,否则JButton不会触发任何东西。

现在我可以忍受这一点,因为我可以轻松捕捉鼠标按钮1并执行我的操作,但如何捕捉加速器的使用?它将触发动作事件,但我没有看到任何捕获它的可能性,因为它返回'0'作为修饰符(与除1,2和3之外的任何其他鼠标按钮相同)。

有什么方法可以告诉JMenuItem它应该只响应鼠标按钮1和它的加速器?与JButton的方式相似吗?

1 个答案:

答案 0 :(得分:0)

    JMenuItem mntmQuit = new JMenuItem("Quit");
    mntmQuit.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (!(e.getModifiers() == InputEvent.BUTTON3_MASK)) {
                System.out.println(e.getActionCommand());
            }
        }
    });
    mntmQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, 0));

修改

我已经改变了我的答案,而不是检查事件何时被触发,你应该检查什么时候不开火。所以在这种情况下,Button3或右键单击。按“q”或任何鼠标单击时,事件将始终触发。

之前的答案很糟糕,您不想使用e.getModifiers(),因为对于您不想返回true的事件,它可能会返回true。例如如果您将“q”和“w”设置为相同的按钮,但它们执行不同的操作,则会在第一个if语句检查e.getModifiers() == 0

时触发这两个事件

对于这种混乱感到抱歉,希望这更有意义。