1

私のスイング アプリケーションでは、JDialog を使用し、JDialog に JPanel を追加しました。マウスが JDialog を終了したときに、JDialog のマウス リスナーが呼び出されるようにします。これが私がやった方法です。

myJDialog.addMouseListener(new java.awt.event.MouseAdapter() {  
    public void mouseExited(java.awt.event.MouseEvent evt) {  
        System.out.println("Mouse has exited the Dialog");  
    }  
});

実際にはマウスが終了したときに呼び出されますが、JDialog に追加された Jpanel にある JTextField にマウスが入ると、マウスがまだ JDialog 内にあるにもかかわらず、マウスが終了したときにこのリスナーが呼び出されます。マウスが完全に終了したときに呼び出され、マウスがそれ自体の子コンポーネントに移動したときに呼び出されないようにしたいのです。どうすればこれを解決できますか?

4

1 に答える 1

2

これは簡単に答えられる質問ではありません。

まず、mouseListener から始めましょう。コンテナー (この場合はダイアログ) を 3D プランと考えてみてください。そのプランの上にコンポーネントを追加します。各コンポーネントは、コンテナーの上の 1 つ以上のレイヤーに存在します (素敵な影を落とします)。

ここで、マウスを、その平面図の上部を指すレーザーと考えてください。レーザー光がコンテナーに到達できる限り、マウス イベントに関する通知を受け取ります。ただし、別のコンポーネントがマウスをブロックするようにマウスを移動すると (レーザーがコンポーネントに届かなくなる)、イベントがブロックされるため、通知の受信が停止します。

現在、通知システムは、マウスがあなたの影響範囲に入ったときに通知するのに十分親切です。

これがシステムの仕組みです。グローバル イベント ハンドラー (少なくともマウス コンテキストがどこに移動したかがわかります) を使用する以外に、私が考えることができる唯一の「その他の」解決策は、マウス終了イベントの座標を確認し、それらをコンテンツと照合することです。ペインの境界。

public void mouseExit(MouseEvent evt) {
    Point p = evt.getPoint();
    Rectangle bounds = getBounds();

    bounds.x += 4;
    bounds.y += 4;
    bounds.width -= 4;
    bounds.height -= 4;

   if ((p.x < bounds.x || p.x > bounds.x + bounds.width) && (p.y < bounds.y || p.y > bounds.y + bounds.height) {

       System.out.println("Elvis has left the building");

   }

}

もちろん、これを適切に行うには、おそらく微調整が必​​要になるでしょう。

于 2012-07-19T19:50:48.907 に答える