I start exploring the JavaFX FXML application technology.
I use one main Stage accessed in Main class with Main.getStage()
that is invoked in the start of application with the overriden method public void start(Stage stage)
. Having two public static Scene
inside to keep the persistence while switching them.
@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;
}
Both Scenes have the same controller class called MainController
. Using:
- Button with
fx:id="buttonLoginRegister"
to go to theREGISTER
Scene - Button with
fx:id="buttonRegisterBack"
to go back to theLOGIN
one.
and both having the same onClick
event handleButtonAction(ActionEvent event)
. The TextFields are fields for a username to log in/register.
@FXML private Button buttonLoginRegister;
@FXML private Button buttonRegisterBack;
@FXML private TextField fieldLoginUsername;
@FXML private TextField fieldRegisterUsername;
@FXML
private void handleButtonAction(ActionEvent event) throws IOException {
Stage stage = Main.getStage();
if (event.getSource() == buttonLoginRegister) {
stage.setScene(Main.REGISTER);
stage.show();
// Setting the text, the working way
TextField node = (TextField) stage.getScene().lookup("#fieldRegisterUsername");
node.setText(fieldLoginUsername.getText());
// Setting the text, the erroneous way
// fieldRegisterUsername.setText(fieldLoginUsername.getText());
} else {
stage.setScene(Main.LOGIN);
stage.show();
}
}
My goal is to copy the value from the LOGIN
TextField to the one in the REGISTER
scene. It works well using the code above. However firstly I tried to access the element in the another Scene with:
fieldRegisterUsername.setText(fieldLoginUsername.getText());
And it's erroneous. To be exact, the fieldRegisterUsername
is null
.
Why are some elements found with the lookup(String id)
method and not with @FXML
annotation?