12

JavaのMouseEventsがキーとマウスボタンの間で修飾子を共有するのはなぜですか?

以下の簡単なコードを考えてみましょう。

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);
}

ウィンドウを3回クリックすると(左クリック1回、中クリック1回、右クリック1回)、次の出力が表示されます。

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キーが押されていると報告されていることがわかります。これは十分に文書化されており、MouseEventのJavadocには、この重複について言及している行もあります。しかし、私の質問は、なぜそれがこのように報告されるのかということです。中クリックでe.isAltDown()からtrueを返す理由は何ですか?

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

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

4

1 に答える 1

7

このフラグの再利用は、歴史的な理由によるものだと思います。元の動機については推測することしかできませんが、将来の拡張のために多くのビットを使用できるようにするために、あまり多くのビットを使用していなかった可能性があります。もう 1 つの理由は、Mac にはマウスが 1 つしかないという事実であった可能性があります。したがって、修飾子は、十分な数のシステム上で別のマウス ボタンを通常使用するものを示すために、Mac で一般的に使用されていました (そして今でも使用されています)。

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

于 2013-03-06T21:12:55.727 に答える