2013-03-06 3 views
12

JavaのMouseEventsがキーとマウスボタンの間のモディファイアを共有するのはなぜですか?あなたはウィンドウ内の3回(1回の左クリック、1回の中間クリックし、1の右クリック)をクリックした場合は、次のような出力が表示されますJavaのすべてのミドルクリックがAlt修飾子を持つと報告されるのはなぜですか?

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    frame.setSize(800,600); 
    frame.addMouseListener(new MouseAdapter() { 
     public void mouseClicked(MouseEvent e) { 
      System.out.println(e); 
     } 
    }); 
    frame.setVisible(true); 
} 

は、以下の簡単なコードを考えてみましょう。あなたが見れば

java.awt.event.MouseEvent[MOUSE_CLICKED,(165,149),absolute(165,149),button=1,modifiers=Button1,clickCount=1] on frame0 
java.awt.event.MouseEvent[MOUSE_CLICKED,(292,228),absolute(292,228),button=2,modifiers=Alt+Button2,clickCount=1] on frame0 
java.awt.event.MouseEvent[MOUSE_CLICKED,(293,228),absolute(293,228),button=3,modifiers=Meta+Button3,clickCount=1] on frame0 

は、あなたはすべてのミドルクリックがダウンAltキーを持つと報告されており、すべての権利クリックがダウンMetaキーを持つと報告されていることがわかります。これは十分に文書化されており、このオーバーラップについて言及しているJavadocs for MouseEventの行もあります。しかし、私の質問は、なぜこのように報告されているのですか?中間クリックのe.isAltDown()から真を返す理由は何ですか?

これにより、一部のプラットフォームでAlt + Button1とButton2を区別することが困難になります。

同様に、Javaでのクロスプラットフォームマウスの動作を設計するための「ベストプラクティス」ガイドはありますか?

+1

Mac。または、ワンボタンマウスを使用する可能性のある他のシステム。 – GSP

答えて

7

このフラグの再利用は、歴史的な理由からです。元の動機についてしか推測できませんが、あまりにも多くのビットを使用していない可能性があります。もう一つの理由は、Macにはマウスが1つしかないことがあります。したがって、これらの数が十分にあるシステムでは、通常、Macでさまざまなマウスボタンを使用するような修飾語が使用されていました。

Java 1.4以降、これらの修飾子とボタンを別々に報告するgetModifiersExを使用したいと思います。情報が利用可能なので、下位互換性を維持するために古いインタフェースを通して報告されるだけではありません。

+0

私は元の動機づけに入った設計要件についてもう少し学びたいと思っていました。 – JohnnyO

関連する問題