2

次のコードを見てください。

public static void main(String[] args) {
        Group group1 = new Group();
        Group group2 = new Group();

        Label label = new Label("test");

        group1.getChildren().add(label);
        group2.getChildren().add(label);

        System.out.println("Size group1: " +group1.getChildren().size());
        System.out.println("Size group2: " +group2.getChildren().size());
    }

ラベルがgroup2に追加されると、group1から自動的に削除されます。なぜこれが意図されているのか誰かが知っていますか?

今までは、グループクラスからの境界などの追加機能は必要なく、単純なArrayListを使用してラベルオブジェクトへの参照を格納していました。

4

1 に答える 1

5

Nodeドキュメントから:

ノードは、シーン グラフの任意の場所で最大 1 回発生する可能性があります。具体的には、ノードは、Scene のルート ノード、Parent の子 ObservableList、または Node のクリップのすべてで 1 回しか表示されない必要があります。

...

プログラムが子ノードを親 (グループ、リージョンなどを含む) に追加し、そのノードが既に別の親の子であるか、シーンのルートである場合、ノードは自動的に (そしてサイレントに) 元の親から削除されます。

...

たとえば、サブツリーをシーン グラフ内のある場所から別の場所に移動するなど、シーン グラフの構造を再配置することができます。これを行うには、通常、サブツリーを新しい場所に挿入する前に、古い場所からサブツリーを削除します。ただし、アプリケーションが明示的に削除しない場合、サブツリーは上記のように自動的に削除されます。

Nodeに追加されるSceneと、JavaFX システムはシーングラフのその場所にあるそのノードに固有の属性を設定および管理します。1 つの例は、親レイアウト マネージャーとその制約によって決定されるノードの場所です。もう 1 つは、親ノードから継承された CSS スタイル セットです。これらの種類のデータは両方とも、シーン グラフ内のノードの位置によって異なる場合があります。

同じノードをシーン グラフの別の場所に配置することをシステムが許可した場合、最初の場所に対して決定されたシステム計算属性が上書きされます。すべてが非常に混乱し、推論が困難で微妙なバグを持つプログラムが作成されます。

于 2012-11-26T19:32:58.370 に答える