因此,我不得不在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));我从来没有见过一个菜单项是在右键单击或使用其他鼠标按键时调用的,似乎Swing对此有不同的看法,无论按下哪个鼠标按键都会发送一个操作事件-这与JButton相反,后者不会触发任何东西,除非用鼠标按键1单击。
现在我可以接受这一点,因为我可以很容易地抓住鼠标键1并执行我的操作,但是如何抓住加速器的用法呢?它将触发action事件,但我看不到任何捕获它的可能性,因为它返回'0‘作为修饰符(与除1、2和3之外的任何其他鼠标按钮相同)。
有没有什么方法可以告诉JMenuItem,它应该只对鼠标按键1和它的加速器做出反应?类似于JButton的方式吗?
发布于 2013-04-24 02:43:54
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”设置为同一个按钮,但它们做的事情不同,则这两个事件将在检查e.getModifiers() == 0的第一个if语句时触发
很抱歉造成了混乱,希望这更有意义。
https://stackoverflow.com/questions/16176523
复制相似问题