2017-07-13 63 views
1

円の上に線を作成しようとしています。私が試してみましたJavaFXで図形を他の図形に重ねる方法

もの:

  • 私は私がstackpaneのようないくつかの望ましくない結果が広がっていないしまったシーンのコンストラクタに送られたグループにStackPaneに円を加え、次いでStackPaneとライン完全にステージ上で

  • サークルの後にラインを追加すると自動的にその上に置かれますが、それ以上のコントロールが必要です。

は例えば、私は10台の形状を有すると私はそれらすべてを宣言してから何の上に行くと、私はJavaFXのは、塗料どの順番

+1

これを見[Zオーダー(https://stackoverflow.com/questions/2988196/z-order-in-javafx)。 'Pane'または' Group'に 'Node'sを追加し、その位置を設定するだけで仕事をするべきです。すべての 'Node'を中心にして重なり合わせたい場合は' Node'sの全てを 'StackPane'に追加してください。 – Sedrick

+1

ポストa [mcve] .. – user1803551

答えて

5

でそれらを追加することを心配する必要はありませんものを決定したい

JavaFXは、Parentノードのchildrenを最初から最後までペイントして、最後のノードが最初のノードにペイントされるように、Painter's algorithmを使用します。

これは、immediate modeではなく、pulseごとにretained modeで行われます。したがって、JavaFXグラフィックスシステムへのロジックの制御を放棄するまで、項目はペイントされません。つまり、アイテムをシーングラフに追加してから、シーングラフ内で希望通りに並べ替えたり移動したりすることができます。

JavaFXでの3DペインティングでもZ-bufferingを使用できますが、この回答は、Zバッファなしの同じZ座標値を持つ要素の2Dペイントに関するものです。親の子リストにノードを追加することにより、ノード

用塗料の順序を設定する方法

、あなたはGroup親またはPane親に自分のノードを配置することができます。ノードは、子リストに追加した順にペイントされます。

CSSを使用したい場合はウィンドウが有効です。それ以外の場合は、通常はグループが行います。また、ペインにはサイズ変更可能な範囲があり、グループには適用されません。これらの理由から、私は通常、グループの上にペインを使用することを好みます。

子供が描かれる順序を変更するには、ノードを子供リスト内の所定の位置に移動します。

たとえば、次のコードは、親ウィンドウの子リスト内の最初および第五項目のペイント順序を変更します:

また
Collections.swap(parentPane.getChildren(), 0, 4) 

Nodeは、ノードを移動するtoFronttoBack便利なメソッドを持っていますノードの親の子リストの前または後ろ。レイアウトペインの使用状況に関する

アドバイス

明示的に位置したいノードを保持するため、このようなStackPaneなどのレイアウトペインを使用しないでください。StackPaneなどの管理されたレイアウトペインは、レイアウトペインの内部アルゴリズムに従って、自動的にノードのレイアウトを処理するように設計されています。たとえば、デフォルトでは、StackPaneに追加するすべてのノードがStackPaneの中央に配置されます。

関連

+0

"*親ノードの子を最初から最後までペイントして、最後のノードが最初のノードにペイントされるようにします。*"正しく覚えていれば、ペイント操作を節約するためにシェイプがペイントされます。汚れた領域が最初に計算され、同じペインティングサイクル中にすべての図形が描画され、別の図形に塗りつぶされた1つの図形と区別されます。 – user1803551

+0

はい、ダーティ領域のJavaFX実装にはパフォーマンス最適化が組み込まれていますが、それらは最適化に過ぎず、結果は変わりません。 – jewelsea

関連する問題