我開始研究JavaFX FXML應用程序技術。JavaFX FXML訪問成功使用lookup()方法,但不使用@FXML註釋
我使用主類中訪問的一個主舞臺Main.getStage()
,它在應用程序開始時使用重寫方法public void start(Stage stage)
調用。在內部有兩個public static Scene
以在切換它們時保持持久性。
@Override
public void start(Stage stage) throws Exception {
STAGE = stage;
LOGIN = new Scene(FXMLLoader.load(getClass().getResource("Login.fxml")));
REGISTER = new Scene(FXMLLoader.load(getClass().getResource("Register.fxml")));
STAGE.setScene(LOGIN);
STAGE.setTitle("FXApplication");
STAGE.show();
}
public static Stage getStage() {
return STAGE;
}
這兩個場景都有相同的控制器類,稱爲MainController
。使用:
- 按鍵採用
fx:id="buttonLoginRegister"
去REGISTER
場景 - 按鍵採用
fx:id="buttonRegisterBack"
回去給LOGIN
之一。
並且兩者具有相同的onClick
事件handleButtonAction(ActionEvent event)
。 TextFields是用於登錄/註冊用戶名的字段。
我的目標是將值從LOGIN
文本字段複製到一個在REGISTER
現場。它使用上面的代碼很好用。然而,首先我嘗試訪問另一個場景中的元素:
fieldRegisterUsername.setText(fieldLoginUsername.getText());
這是錯誤的。確切地說,fieldRegisterUsername
是null
。
爲什麼在lookup(String id)
方法中發現某些元素而不是@FXML
註釋?
通常不鼓勵用於不同FXML(視圖)的共享控制器。如果你只是從JavaFX開始,我特別建議不要這樣做。看看[這個問題](http://stackoverflow.com/questions/17914254/javafx-multiple-fxml-and-1-shared-controller)。 – Itai
這是有爭議的,很多開發人員使用這種方式,並且相同的數字是最簡單的。就我個人而言,在2個小場景中我看不出共享控制器的壞處。我之前已經閱讀過這個鏈接的問題,但是這與我的持久性需求相沖突。 –
不知道我明白你的意思是「需要堅持」。查看我的答案,解釋爲什麼'lookup'在你的情況下起作用。請記住,除非你爲'FXMLLoader'設置了控制器,否則每次調用'load'都會創建一個控制器類的新實例。 – Itai