Je souhaite modifier les écrans de l'interface utilisateur de login.fxml
à home.fxml
.
Devrais-je changer le Stage
ou le Scene
? De plus, puis-je utiliser une expression lambda pour le gestionnaire dans le contrôleur?
Tout d’abord, commençons par Stage
.vs. Scene
issue:
Comme on le sait, la hiérarchie JavaFX
est basée sur: Stage
-> Scene
-> Nodes
(etc).
Vois ici:
En pratique, une règle empirique à mon avis est the future:
Si vous envisagez de passer à un autre lieu dans le flux de votre programme (login -> profile, par exemple) - changez la Stage
.
Si vous êtes dans le même environnement} _ (identifiez-vous pour la première fois -> identifiez-vous après plusieurs tentatives infructueuses) - changez la Scene
.
Comme pour lambdas: Ahhmmm ... si votre version Java
/JavaFX
a la capacité - il n'y a aucune raison de ne pas utiliser . Pour plus d'informations sur les gestionnaires de contrôleurs dans Java 8, voir ce excellent tutoriel .
J'utilise cette approche pour changer de scène dans JavaFX
:
/**
* Controller class for menuFrame.fxml
*/
public class MenuFrameControl implements Initializable {
@FXML private Button sceneButton1;
@FXML private Button sceneButton2;
@FXML private Button sceneButton3;
/**
* Event handling method, loads new scene from .fxml file
* according to clicked button and initialize all components.
* @param event
* @throws IOException
*/
@FXML
private void handleMenuButtonAction (ActionEvent event) throws IOException {
Stage stage = null;
Parent myNewScene = null;
if (event.getSource() == sceneButton1){
stage = (Stage) sceneButton1.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene1.fxml"));
} else if (event.getSource() == sceneButton2){
stage = (Stage) flightBtn.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene2.fxml"));
} else if (event.getSource() == sceneButton3) {
stage=(Stage) staffBtn.getScene().getWindow();
myNewScene = FXMLLoader.load(getClass().getResource("/mvc/view/scene3.fxml"));
}
Scene scene = new Scene(myNewScene);
stage.setScene(scene);
stage.setTitle("My New Scene");
stage.show();
}
@Override
public void initialize(URL location, ResourceBundle resources) { }
Ainsi, lorsque vous cliquez sur le bouton, vous enregistrez l’objet Stage
réellement affiché dans la variable stage
. Ensuite, il charge le nouvel objet Scene
à partir du fichier .fxml dans la variable myNewScene
, puis place cet objet Scene
chargé dans votre objet Stage
enregistré.
Avec ce code, vous pouvez créer un menu de base à trois boutons, où chaque bouton bascule vers une scène différente en utilisant un seul objet Stage
.