2

私は最初に別の問題を抱えていたので、この投稿を作成しました :

その答えにより、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 を追加するという最初の質問の解決策を使用しました。

4

2 に答える 2

2

SwingUtilities のconvertXxxまたは getXxx メソッドが本当に必要な場合は、両方の質問から明確ではありません

1) に配置(マウス イベントのJLabelディスパッチ)できGlassPaneます。JLabelRectangleJFrameBounds

2) に配置(マウス イベントのJLabelディスパッチ)できJViewportます。JLabelRectangleJScrollPane / JViewportBounds

3)使用できますJLayeredPane(最大6層)

JLayer4) (Java7)に基づいて使用できます(Java6JXLayerの場合とおそらくより良い選択)

于 2012-03-22T01:22:43.850 に答える
0

「ルートペインの使用方法」を参照してください。Javaチュートリアルで、「redispatches」(ページダウンについて)という単語を検索します。これには、チェックボックスで達成しようとしているものと同様の例があります。

http://docs.oracle.com/javase/tutorial/uiswing/components/rootpane.html

要するに、マウスカーソルの位置を変換しながらSwingUtilities.getDeepestComponentAt(..)使用する必要があります。Component.dispatchEvent(..)

于 2012-03-22T00:30:54.567 に答える