2

所以我必须在 Swing 中为我的 Java 类创建一个简单的 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 对此的看法不同,并且无论按下哪个鼠标按钮都会发送一个动作事件 - 与JButton哪个不会除非用鼠标按钮 1 单击它,否则触发任何东西。

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

有什么方法可以告诉我JMenuItem它应该只对鼠标按钮 1 和它的加速器做出反应?类似的方式JButton吗?

4

1 回答 1

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

很抱歉造成混乱,希望这更有意义。

于 2013-04-23T18:43:54.010 回答