web-dev-qa-db-ja.com

JavaFXのGridPaneがレイアウトのプロパティをコンポーネントにアタッチするのはなぜですか?

私は現在JavaFXを学んでいて、GUIコンポーネントをレイアウトするための非常に奇妙なAPIに出くわしました。それはおそらく javadoc によって最もよく説明されます:

GridPaneを使用するには、アプリケーションで子にレイアウト制約を設定し、それらの子をgridpaneインスタンスに追加する必要があります。制約は、GridPaneクラスの静的セッターメソッドを使用して子に設定されます。

 GridPane gridpane = new GridPane();

 // Set one constraint at a time...
 // Places the button at the first row and second column
 Button button = new Button();
 GridPane.setRowIndex(button, 0);
 GridPane.setColumnIndex(button, 1);

 // or convenience methods set more than one constraint at once...
 Label label = new Label();
 GridPane.setConstraints(label, 2, 0); // column=2 row=0

 // don't forget to add children to gridpane
 gridpane.getChildren().addAll(button, label);  

アプリケーションは、制約の設定と子の追加のステップを組み合わせる便利なメソッドを使用することもできます。

 GridPane gridpane = new GridPane();
 gridpane.add(new Button(), 1, 0); // column=1 row=0
 gridpane.add(new Label(), 2, 0);  // column=2 row=0

「ステップを組み合わせる便利なメソッド」を提供するだけではなく、奇妙な方法でレイアウトデータを与える目的(つまり、最初のメソッドセット)の目的は何なのかと思います。

これはいくつかの理由で奇妙に見えます:

  1. Swing、私が詳細に知っている他の唯一のGUIライブラリは、そのすべてがそのadd()メソッドの一部として渡され、GridBaneとほぼ同じように見えるGridBagLayoutにあります。
  2. GridPane.setConstraints()メソッドが実際にデータを格納しているオブジェクトが明確ではありません。すべてのコンポーネントが特定の時点で使用中または使用されていない可能性があるレイアウトのメンバー変数を持つことはあまり意味がなく、メソッドに参照がないため、実際のコンポーネントオブジェクトにあるとは思えません特定のGridPaneが使用されているため、そこに追加することもできません。
  3. 他のJavaFXレイアウトには、私にとって論理的に見えるものに非常に似たものがあり、レイアウトデータをaddメソッドのレイアウトペインに BorderPane のsetCenter()、setLeft()などのメソッドで提供します。 。
2
john01dav

ポイント2に関して:制約は、GridPaneに追加するNodeに保存されます。すべてのNode(およびシーングラフ内のすべての可視オブジェクトはNodeから派生します)、「プロパティ」と呼ばれるHashMapがあります。

アプリケーション開発者は、必要に応じて任意のデータをそこに配置できますが、各レイアウトクラスは、レイアウトの制御に使用されるいくつかのプロパティも定義します。したがって、NodeをGridPaneに配置する場合、複数の列にまたがるようにするには、ノードの「gridpane-column-span」プロパティで適切な値を設定します。

概念的には、CSSに少し似ていると思います。 CSSクラスをノードに追加すると、シーングラフ(またはHTMLの場合はドキュメントフロー)に挿入される場所に基づいて、スタイルとレイアウトに影響します。同様に、ノードにレイアウト制約を追加し、ノードを挿入するレイアウトコンポーネントは、子ノードをレイアウトするときにこれらの制約を解釈します。

私は実際にJavaFXが使用するモデルが本当に好きです-任意のノードは任意のレイアウト制約を含むことができます。それらを解釈するのはレイアウトコンポーネント次第です。つまり、独自のレイアウトコンポーネントを作成してカスタムレイアウトを実行し、必要に応じて独自のカスタムレイアウト制約を作成できます。これらのコンポーネントはすべて、既存のノードで適切に機能します。

ポイント3:BorderPaneは、ノードを配置できる5つの「ゾーン」が非常に明示的に存在するという点で異なります。だから、私は彼らが便宜上それに「適切な」APIを与えたと思います。

1
David