2010-11-21 10 views
3

私は学校JavaプロジェクトのConnect Fourゲームに取り組んでいます。私はJLayeredPaneの「方法」を持っていますが、期待どおりに動作していますが、特定のコンセプトの背後にある「理由」をあまり理解していません。ここでJLayeredPane:深さと位置の機能的な違いは何ですか?

は私の理解です:

のJLayeredPaneを使用すると、各コンポーネントの深さと位置を指定することができるのJPanelに類似の容器、です。深さは整数であり、0が最下層であり、n-1が最上位層であり、nは成分の数である。 Positionは、レイヤー内でコンポーネントの位置を指定するint型(Integerラッパークラスを使用し、1つはプリミティブ型です)です.0は最上位レイヤー、-1は最下位レイヤー、間には、数字が小さいほど高い位置になります。したがって、1つのレイヤー内の4つのコンポーネントは、最上位から最下位に向かって0,1,2,1の位置に配置できます。

私の質問は、どちらの概念を持つ必要がありますか?

たとえば、画像付きの3つのJLabel:フロントボード、バックボード、およびピースを作成しました。この作品はフロントボードの前にあり、フロントボードとバックボードの間にあることもあります。 2番目の例を見てみましょう。

Iは、これらの手段のいずれかを介して同じ効果を得ることができる:

1)I 0、位置0を層にバックボードを設定することができます。レイヤー1のピース、位置0;そしてfrontBoard位置0

or 

2、2層に)I 0、位置-1層にバックボードを設定することができます。レイヤー0、位置1へのピース。フロントボードをレイヤー0、ポジション0に変更します。

これらの方法の両方をテストしましたが、2つの方法の機能的な違いはありません。

誰でもこの謎を解き明かしてくれますか?

答えて

1

まず第一に、このような場合に行うための最善のことは、彼らは通常、非常に有益です、チュートリアルを見ている:http://download.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

また、クラス自体のjavadocはかなり良い説明が含まれていますway JLayeredPaneが動作します。

すでにプロジェクトを実装しているので、各コンポーネントを独自のレイヤーに配置すること、または同じレイヤーに異なる位置の値を持つ異なるコンポーネントを割り当てることによって、コンポーネントのスタッキングを実現できます。効果は同じですが、あなたはそれを達成するために2つの異なるプロパティを使用します。

  • 「深さ」の財産である:深さ0を持つ層が遠いように彼らが列挙されています最も低い。深度の高いレイヤーは深度の低いレイヤーをカバーします。
  • レイヤは複数のコンポーネントを含むことができ、コンポーネントは常に重複する可能性があるため、コンポーネントのZオーダーを定義する方法が必要です内のレイヤをポジションで列挙して "値。レイヤー内にnのコンポーネントがあり、0でカウントを開始する場合、位置は0〜n-1の範囲の値でなければなりません。

「位置」値があるので、単に「位置」値を使ってすべてのコンポーネントをz軸に沿って配置することができるため、複数のレイヤーを必要としないと主張できます。それは事実であり、誰もそうすることはできません。

あなたがそこに定義済みの定数が層の「深さ」の値に使用することを認識したときに、複数の層のための根拠を見ることができます。 MODAL_LAYER

  • DEFAULT_LAYER
  • PALETTE_LAYER
  • POPUP_LAYER
  • DRAG_LAYER

これは、複雑なマルチウィンドウアプリケーションの単なる論理グループです。スタッキング制約が満たされているかどうかを確認するのに役立ちます。メインアプリケーションフレームの上に表示されるモーダルダイアログウィンドウを作成するとします。単一のレイヤーを使用する場合は、表示されているすべてのコンポーネントの位置を自分で追跡し、ダイアログの位置をnに設定する必要があります。ドラッグ&ドロップアニメーション、ポップアップメニューなどを追加すると、この作業はかなり複雑になります。

定義済みのレイヤーを使用することによって、この複雑さが軽減されます。モーダルダイアログウィンドウを表示する場合は、メインアプリケーションウィンドウのコンポーネントは気にせず、MODAL_LAYERに配置するだけで完了です。他のすべてのコンポーネントの上に表示されていることが確実です。

幸いなことに、SwingはJLayeredPaneまたはそのサブクラスを内部的に使用しているので、JDialogでsetVisible(boolean)またはsetModal(boolean)を呼び出すことができます。それに。

+0

あらかじめ定義された定数を使用しやすいことは確かにプラスです。私は2つの方法の間にいくつかの実際の機能的な違いを見つけることを望んでいたが、私はあなたが正しいと信じて、ない。 「位置」の説明には、一番下の位置が-1であり、一番上の位置が0であり、その間の有効な値がn-1ではなくn-2であることは記載されていません。 お返事ありがとうございます! – NeutralAngel

関連する問題