3

次のようなものを宣言すると

@FXML
private final static double PREF_SPACING = 10d;

また

@FXML
private Insets insets = new Insets(10d);

コントローラー クラスで、Scene Builder でそれらの値を使用する方法はありますか?

値を変更したいときは、コントローラークラスで一度だけ変更したい。

4

2 に答える 2

4

暫定 的な回答 以下のすべての手法をまだ試していませんが、ドキュメントを読むと、その方法のように思えます。時間があれば、後で試して、この回答を結果で更新します(または、他の誰かがこれを実行して新しい回答を投稿するか、これを編集して決定的な回答を作成できます)。私が正しい方向であると信じていることをあなたに示すために、今何かを公開したかっただけです.

以下が探しているものではない場合は、質問にいくつかの詳細を追加して、必要なものを完全に説明してください.


@FXMLここでは注釈 を使用しないでください。@FXMLマークアップからコントローラーに値を注入するためのものであり、その逆ではありません。

定数である最初の例では、コントローラークラスが次のようになっているとしましょう。

class MyControllerType {
  public final static double PREF_SPACING = 10d;
}

次に、fxml で定数を参照します。

<?import MyControllerType?>
...
<VBox>
  <spacing><MyControllerType fx:constant="PREF_SPACING"/></spacing>
</VBox>

定数でも SceneGraph の一部でもない 2 番目のサンプルでは、fx:define​​要素を使用してクラスのインスタンスをインスタンス化できます。Insets クラスにはビルダー クラスも長さゼロのコンストラクターもないため、FXML から Insets クラスを直接インスタンス化できないことに注意してください。そのため、情報用に別のプレースホルダー クラスを作成し、FXML 内でそれへの参照をインスタンス化することができます (または、FXML がインセットをインスタンス化するために使用できるビルダーを作成できます)。

class InsetsHolder {
  private Insets insets = new Insets(10d);
  public Insets getInsets();
}

<?import InsetsHolder?>
<fx:define>
  <InsetsHolder fx:id="i"/>
</fx:define>
<VBox>
  <Button text="Click Me!" VBox.margin="$i.insets"/>
</VBox>

fx:defineSceneBuilder は、 and表記を使用する fxml ファイルを読み取ることができる必要がありfx:constant、(おそらく) 参照式を使用することもできます$i.insets。SceneBuilder には、SceneBuilder アプリケーション内から値を編集できる UI がない場合があるため、これらの構造を利用したい場合は、fx:defineおよび要素に関連する fxml ファイル部分を手動で編集する必要があります。fx:constant

FXML での解像度に依存しないユニットの設計に関するfx:defineこのメーリング リストの投稿には、要素を使用する実行可能な例があります。

一般に、fxml と Java コードの間でこの種の依存関係を維持することには少し注意が必要だと思います。initializescottb が示唆するように、コントローラ メソッドのコンテキスト内でプレーンな Java コードでこの種の処理を行う方が賢明かもしれません。

于 2013-05-21T00:22:27.840 に答える
2

@FXML アノテーションを使用すると、シーン グラフが fxml マークアップからロードされるときに、定義した名前 (fx:id) を持つ JavaFX オブジェクトの参照をコントローラ オブジェクトの非パブリック フィールドに反射的に挿入できます。

私の知る限り、これは一方向の操作です。ロード中にシーン グラフに挿入されたコントローラー オブジェクトに、名前付きの静的クラス変数を含めるための規定はありません。

コントローラー オブジェクトのクラスでクラス変数として設定する値を定義し、適切なオブジェクト プロパティを (マークアップではなく) プログラムで initialize() メソッドに設定することで、要求しているものと非常によく似たものを実現できます。コントローラー オブジェクト。

initialize() メソッドは、シーン グラフのロードが完了した後 (存在する場合) 呼び出されます (したがって、すべての GUI オブジェクトがインスタンス化されます) が、アプリケーションの呼び出しコードに制御が戻る前に呼び出されます。

于 2013-05-21T00:11:10.807 に答える