19

@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 ;

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

4

3 に答える 3

51

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

@FXML
private Label timerLabel = new Label();

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

実際の質問にたどり着くには:

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

  1. 属性にpublic一致する変数名を持つ任意のフィールド、またはfx:id
  2. で注釈が付けられpublicた属性と一致する変数名を持つ任意のフィールド (またはそうでないフィールド) 。fx:id@FXML

したがって、あなたの例では、すべてのフィールドがであるため、すべての注釈を (最初の注釈も含めて)public省略しても機能します。@FXML

ただし、グッド プラクティスに従って fields を作成する場合は、インジェクションが機能するprivateように各宣言に注釈を付ける必要があります。@FXML

そう

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

などは動作しますが、

@FXML
private Label timerLabel;
private TextField mainTextField;

しない。

于 2015-05-13T11:09:22.630 に答える
7

それぞれ

fx:id="somename"

あなたには必要だ

@FXML
public SomeClass somename;

1行で書いたほうが読みやすいので好きです。

@FXML public SomeClass somename;

初期化せずに

@FXML
public Label timerLabel = new Label(); // this is wrong
于 2015-05-13T11:05:45.270 に答える