web-dev-qa-db-ja.com

@FXMLはすべての宣言に必要ですか?

@FXMLはすべての宣言に必要ですか、それとも最初の宣言だけに必要ですか?

つまり、使用する必要があります

@FXML
public Label timerLabel = new Label();
@FXML
public TextField mainTextField, projectTextField ;
@FXML
public Button goButton, deleteAllButton ;
@FXML
public ComboBox<String> projectComboBox ;
@FXML
public TableView<Entry> mainTable ;
@FXML
public TableColumn<Entry, String> titleColumn, timeColumn, dateColumn ;
@FXML
public TableColumn<Entry, Boolean> checkColumn, buttonColumn ;
@FXML
public checkBox checkAllCheckBox ;

または

@FXML
public Label timerLabel = new Label();
public TextField mainTextField, projectTextField ;
public Button goButton, deleteAllButton ;
public ComboBox<String> projectComboBox ;
public TableView<Entry> mainTable ;
public TableColumn<Entry, String> titleColumn, timeColumn, dateColumn ;
public TableColumn<Entry, Boolean> checkColumn, buttonColumn ;
public checkBox checkAllCheckBox ;

ありがとうございました!

14
Romeo

_@FXML_アノテーションを使用すると、FXMLLoaderはFXMLファイルで定義された値をコントローラークラスの参照に挿入できます。つまり、timerLabelに_@FXML_の注釈を付けると、load()メソッドがの要素によって呼び出されたときに、FXMLLoaderによって初期化されます_fx:id="timerLabel"_を含むFXMLファイル。他の人がコメントで指摘したように、これはあなたがのようなコードを書くべきではないことを意味します

_@FXML
private Label timerLabel = new Label();
_

ここでtimerLabelは、最初にコードで作成したnew Label();に初期化され、その後すぐにFXMLファイルで定義された値に再初期化されます。これはせいぜい冗長であり、最悪の場合は誤解を招きます。変数名を_fx:id_に正しく一致させないと、変数が誤ったLabelを参照しているため、エラーの追跡が非常に困難になります。

あなたの実際の質問に行くには:

FXMLLoaderがFXMLファイルをロードするとき、_fx:id_属性を持つ要素をコントローラーに挿入しようとします。探します

  1. _fx:id_属性に一致する変数名を持つpublicフィールド、or
  2. _fx:id_で注釈された_@FXML_属性と一致する変数名を持つフィールド(publicかどうかにかかわらず)。

したがって、この例では、すべてのフィールドがpublicであるため、すべての_@FXML_アノテーション(最初のものも含む)を省略しても、引き続き機能します。

ただし、適切な方法に従ってフィールドをprivateにした場合、インジェクションを機能させるために、各宣言に_@FXML_の注釈を付ける必要があります。

そう

_@FXML
private Label timerLabel;
@FXML
private TextField mainTextField;
_

などは機能しますが、

_@FXML
private Label timerLabel;
private TextField mainTextField;
_

しない。

40
James_D

それぞれに

fx:id="somename"

あなたには必要だ

@FXML
public SomeClass somename;

1行で書くほうがいいです。たくさんあると読みやすいからです

@FXML public SomeClass somename;

初期化せずに

@FXML
public Label timerLabel = new Label(); // this is wrong
7
hanbin615
@FXML
private TextField idTextField;

@FXML
private TextField passwordTextField;

OR

@FXML
private TextField idTextField, passwordTextField;
0
UMEGS Hamza