私は最初に別の問題を抱えていたので、この投稿を作成しました :
その答えにより、Java GlassPane にたどり着きました。これに関するSOの他の投稿を見ましたが、それらはすべてこの記事を指しています: http://weblogs.java.net/blog/alexfromsun/archive/2006/09/a_wellbehaved_g.html。
記事 (FinalGlassPane.java) の例を使用し、テスト アプリとまったく同じように設定しました。
GlassPane glass = new GlassPane(this);
getRootPane().setGlassPane(glass);
GestureListener gl = new GestureListener();
glass.addMouseMotionListener(gl);
glass.addMouseListener(gl);
glass.setVisible(true);
if (glass instanceof AWTEventListener) {
AWTEventListener al = (AWTEventListener) glass;
Toolkit.getDefaultToolkit().addAWTEventListener(al,
AWTEvent.MOUSE_MOTION_EVENT_MASK | AWTEvent.MOUSE_EVENT_MASK);
}
しかし、私はまだ同じ問題を抱えています。ガラスが原因で、その下のボタン (JButton) をクリックすることができません。
私の最初の SO の質問を読んで、glassPane は私には向いていないと思われる場合は、別の解決策を投稿してください。そうでない場合は、これが機能しない理由を教えてください。
前もって感謝します。
編集: 動作しますが、独自の MouseListener を追加すると動作しなくなります
私のコードでは、独自の を追加していたことに注意してくださいGestureListener
。独自の MouseListener をこの実装に追加することはできません。これが機能しない原因です。これらの線を外したところ、ガラス板が正しく機能するようになりました。
私が本当に理解していないMouseListenerに関するコード(FinalGlassPane.java)にこの通知があるので、私の新しい質問は、このガラスペインに独自のMouseListenerを追加するにはどうすればよいですか?
/**
* If someone adds a mouseListener to the GlassPane or set a new cursor
* we expect that he knows what he is doing
* and return the super.contains(x, y)
* otherwise we return false to respect the cursors
* for the underneath components
*/
@Override
public boolean contains(int x, int y) {
if (getMouseListeners().length == 0 && getMouseMotionListeners().length == 0
&& getMouseWheelListeners().length == 0
&& getCursor() == Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)) {
return false;
}
return super.contains(x, y);
}
追加情報:
メソッドで常に false を返すとcontains(int, int)
、ボタンは常に機能しますが、GlassPane の MouseListener は機能しません。常に「super.contains(x,y)」を返すと、逆のことが起こります。GlassPane の MouseListener は機能しますが、その下のコンポーネントをクリックすることはできません。
最終編集 したがって、アプリケーションがMouseListenerイベント(mousePressed、mouseReleased)を同時に受信できる2つのレイヤーを持つことを(Java 6で)許可する方法がない(またはない)という結論に達しました。最後に、カスタム JButton を作成し、各インスタンスに MouseListener を追加するという最初の質問の解決策を使用しました。