web-dev-qa-db-fra.com

JavaFX: bonne pratique pour naviguer entre les écrans de l'interface utilisateur

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?

8
user4016255

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:

 enter image description here

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 .

11
MordechayS

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.

2
delusionX