我有一些需要从旧的不赞成使用的电话迁移的类: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)

09-10 10:09