所以我必须在我的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
的方式相似吗?
答案 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
对于这种混乱感到抱歉,希望这更有意义。