3 回答

TA貢獻1818條經(jīng)驗 獲得超11個贊
所述@FXML
注釋使得能夠FXMLLoader
注入以FXML文件中定義的值轉(zhuǎn)換為在控制器類的引用。換句話說,如果你的注釋timerLabel
用@FXML
,那么它將會被初始化FXMLLoader
時的load()
方法是通過與FXML文件中的元素叫fx:id="timerLabel"
。正如其他人在評論中指出的那樣,這意味著你永遠不應(yīng)該寫代碼
@FXMLprivate Label timerLabel = new Label();
這里timerLabel
將首先初始化為new Label();
您在代碼中創(chuàng)建的內(nèi)容,然后幾乎立即重新初始化為FXML文件中定義的值。這至多是多余的,最糟糕的是誤導(dǎo)。如果未正確匹配變量名稱,則fx:id
變量將引用錯誤,Label
并且很難跟蹤錯誤。
要了解您的實際問題:
當(dāng)FXMLLoader
加載FXML文件時,它將嘗試將具有fx:id
屬性的任何元素注入控制器。它會尋找
public
具有與fx:id
屬性匹配的變量名稱的任何字段,或任何
public
具有與使用fx:id
注釋的屬性匹配的變量名稱的字段(或不具有)@FXML
。
因此,在您的示例中,由于您的所有字段都是public
,您可以省略所有@FXML
注釋(即使是第一個),它仍然可以工作。
但是,如果您遵循良好做法并制作字段private
,則必須注釋每個聲明@FXML
以使注入工作。
所以
@FXMLprivate Label timerLabel;@FXMLprivate TextField mainTextField;
等會起作用,但是
@FXMLprivate Label timerLabel;private TextField mainTextField;
將不會。

TA貢獻1811條經(jīng)驗 獲得超4個贊
為每個人
fx:id="somename"
你需要一個
@FXMLpublic SomeClass somename;
我更喜歡把它寫成一行,因為當(dāng)有很多時候它更容易閱讀
@FXML public SomeClass somename;
沒有初始化
@FXMLpublic Label timerLabel = new Label(); // this is wrong

TA貢獻1803條經(jīng)驗 獲得超3個贊
@FXMLprivate TextField idTextField;@FXMLprivate TextField passwordTextField;
要么
@FXMLprivate TextField idTextField, passwordTextField;
添加回答
舉報