我有一些需要从旧的不赞成使用的电话迁移的类:MouseEvent getModifiers()
需要将其转换为新样式:MouseEvent getModifiersEx()
单击示例中的框架将调用鼠标侦听器。
请注意,(不建议使用的)getModifiers()给出了rt-click和lt-click的预期结果:
right click: 4, left click: 16
这表明rt-click与lt-click是可区分的,并且位值符合预期。
但是,使用getModifiersEx()不会显示期望值。
getModifiersEx的期望位值为:
right click: 4096, left click: 1024
但是实际看到的值是:
right click: 0, left click: 0
这使得rt-click与lt-click难以区分。
请注意,按下修饰键(例如Shift,Cntrl,Alt)确实设置了预期的位(但是按钮下的掩码位仍然为零,因此rt-click和lt-click仍然无法区分)
调用MouseEvent getButton()确实会返回正确的按钮,因此这是一种变通方法。但是为什么getModifiersEx()不起作用?
这是在MacOS BTW上
/**Example showing issue with MouseEvent.getModifiersEx()*/
public class TrialGetModEx extends JFrame {
public TrialGetModEx() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(300, 200);
setLocation(100,100);
setVisible(true);
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
System.out.print("Mod="+e.getModifiers());
System.out.print(" ModEx="+e.getModifiersEx());
System.out.println();
}
});
System.out.println("Expected Bit values:");
System.out.println(" BUTTON_1_MASK: "+MouseEvent.BUTTON1_MASK);
System.out.println(" BUTTON_3_MASK: "+MouseEvent.BUTTON3_MASK);
System.out.println(" BUTTON_1_DOWN_MASK: "+MouseEvent.BUTTON1_DOWN_MASK);
System.out.println(" BUTTON_3_DOWN_MASK: "+MouseEvent.BUTTON3_DOWN_MASK);
}
public static void main(String[] args) {
new TrialGetModEx();
}
}
最佳答案
经过一番调查后还可以,在这里回答我自己的问题。
尽管文档建议使用getModifiersEx()替换不推荐使用的MouseEvent getModifiers(),但两者之间存在根本的区别。
即,getModifiersEx()表示鼠标按钮的实时状态,这意味着在单击事件发生时,按钮已经被释放(根据定义)。这就是为什么它始终不显示任何按钮被按下的原因。
因此,getModifiersEx()对于在mousePressed()事件期间按下按钮更为有用,而对于mouseClicked()或mouseReleased()事件则不是那么有用。
一种例外是特殊情况,例如说,正在跟踪多个单独的按钮释放。
取代旧式点击检测器的实际内容:if((event.getModifiers() & MouseEvent.BUTTON3_MASK) != 0)
不是getModifiersEx,而是:if(event.getButton()==MouseEvent.BUTTON3)