1

私は現在、ドラッグアンドドロップアプリケーションに取り組んでおり、JLayeredPane 内で何が起こっているのかを本当に知りたいのですが、特定のプログラムの動作が得られます...

契約は次のとおりです。

DEFAULT_LAYER にチェス盤を配置しました。
また、移動するときに DRAG_LAYER に追加したい chessPiece もあります。

だけどフェチがある…

このライン使いたい

layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER);

mouseDragged イベントの下でのみ。

これを行うと、マウスを動かしているうちにチェスの駒が消えて、チェス盤の後ろに隠れてしまいます (?!?)

上記の行を次のように変更すると:

layeredPane.add(chessPiece, JLayeredPane.DRAG_LAYER,0);

すべてが再び正常になります。

なぜそれが起こっているのですか?

4

4 に答える 4

1

GlassPane を使用する必要があります。ラベルの翻訳を開始する前に、MouseDragged イベント内で GlassPane.Add(label) と label.setLocation(x,y) を使用する必要があります。リスナーは、プレーンな MouseListener ではなく、MouseMotionListener でなければなりません。

于 2010-08-18T20:29:24.600 に答える
1

layeredPane.moveToFront(component)パラメータに依存する代わりに使用しindexます。

はではなくadd(Component comp, Object constraints, int index)によって実装されることに注意してください。java.awt.Containerjavax.swing.JLayeredPane

于 2009-09-25T05:11:28.597 に答える
0

問題は、2つの方法の違いは何ですか?APIを読むと、違いがわかります。最初のケースでは、コンポーネントはコンテナの「最後」に追加されます。2番目のケースでは、コンポーネントはコンテナ内の「指定された位置」に追加されます。

DragLayerに追加されるコンポーネントは1つだけなので、理論的には、どちらのaddメソッドを使用しても違いはありません。ただし、DefaultLayerにもコンポーネントがあるため、異なる場合があります。確実に知る唯一の方法は、ソースコードを調べることです。

ただし、他の投稿ですでに提案されているように。このコードは、mouseDragged()イベントで実行しないでください。複数のドラッグイベントが生成されるため、チェスの駒をドラッグレイアウトに継続的に「追加」することは意味がありません。あなたがする必要があるのは、マウスが動かされたときにチェスの駒の位置を変えることです。そのため、mousePressed()イベントを使用して、チェスの駒をドラッグレイヤーに追加します。

于 2009-09-25T05:35:55.537 に答える
0

上記の診断も使用しましたが、次のようになります。

int number = layeredPane.getLayer(chessPiece);

int number3 = layeredPane.getComponentCountInLayer(JLayeredPane.DRAG_LAYER);

ドラッグ中、最初のものは常にドラッグレイヤーの表記である400を返します。しかし、もう一方は最初は 1 を返しますが、ドラッグするとすべてゼロになります...

これは、少なくとも一時的に、チェスの駒が実際にドラッグ レイヤーに入り、その後落下したことを意味します。しかし、それは、ペインに尋ねるとどうなるかです...

これはまったく役に立ちますか?また、jlayeredpane のソース コードのリンクを教えていただけませんか?

私は JLayeredPane.java を探していますが、今まで運がありませんでした...

事前にサンクス...

于 2009-09-25T22:15:19.707 に答える