JavaFX how to change stage

后端 未结 4 1220
不知归路
不知归路 2021-01-31 11:51

I\'m using Netbeans 7.2 with Scene Builder 1.0 to develop a JavaFX application. I have my main screen set up, and I want to have it so I click a button and it\'ll close the main

相关标签:
4条回答
  • 2021-01-31 12:29

    I'm probably saying something similar here, but this is how I do it:

    (In this example, I am transitioning from Login.fxml to Home.fxml).

    Inside the LoginController.fxml class, I have created the following method:

    @FXML
    private void login(javafx.event.ActionEvent event) throws IOException
    {
        if(pwf1.getText().equals("dolphin"))
        {
                Parent blah = FXMLLoader.load(getClass().getResource("Home.fxml"));
                Scene scene = new Scene(blah);
                Stage appStage = (Stage) ((Node) event.getSource()).getScene().getWindow();
                appStage.setScene(scene);
                appStage.show();
        }
        else
        {
                label1.setText("Password is incorrect. Please Try Again");
        }
    }
    

    And that's it.;)

    0 讨论(0)
  • 2021-01-31 12:35

    You can do it this way too:

    Modify your controller.java this way

    Stage thisStage;
    
    public void setStage (Stage stage){
        thisStage = stage;
    }
    
    public void showStage(){
        thisStage.setTitle("Titel in der MainController.java geändert");
        thisStage.show();
    }
    

    It is important that you don't use thisStage in the initialize method.

    Modify your Mainclass this way:

    @Override
    public void start(Stage stage) throws Exception {
        URL location = getClass().getResource("Main.fxml");
        FXMLLoader fxmlLoader = new FXMLLoader();
        fxmlLoader.setLocation(location);
        fxmlLoader.setBuilderFactory(new JavaFXBuilderFactory());
        Parent root = (Parent) fxmlLoader.load(location.openStream());
        Scene scene = new Scene(root);
        stage.setScene(scene);
        MainController mainController = fxmlLoader.getController();
        mainController.setStage(stage);
        mainController.showStage();
    }
    

    You can download a example projekt (netbeans) here.

    0 讨论(0)
  • 2021-01-31 12:39

    Based on your question, recently I was working on developing an iOS equivalent NavigationController for JavaFX, using the simplest idea of push and dismiss views.

    Let me share the code with the community: https://github.com/jalopezsuarez/javafx-screens

    The idea, is to have a very very easy environment to help you change between screens.

    Hope it helps you.

    0 讨论(0)
  • 2021-01-31 12:41

    Download JavaFX samples find the project FXML-LoginDemo , that's what you need. For quick reference i am copy pasting main java class here ;)

    /*
     * Copyright (c) 2008, 2011 Oracle and/or its affiliates.
     * All rights reserved. Use is subject to license terms.
     *
     * This file is available and licensed under the following license:
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     *  - Redistributions of source code must retain the above copyright
     *    notice, this list of conditions and the following disclaimer.
     *  - Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in
     *    the documentation and/or other materials provided with the distribution.
     *  - Neither the name of Oracle Corporation nor the names of its
     *    contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    package demo;
    
    import demo.model.User;
    import demo.security.Authenticator;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javafx.application.Application;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.JavaFXBuilderFactory;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.stage.Stage;
    
    /**
     * Main Application. This class handles navigation and user session.
     */
    public class App extends Application {
        private Stage stage;
        private User loggedUser;
    
        private static App instance;
    
        public App() {
            instance = this;
        }
    
        public static App getInstance() {
            return instance;
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
    
        @Override public void start(Stage primaryStage) {
            try {
                stage = primaryStage;
                gotoLogin();
                primaryStage.show();
            } catch (Exception ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        public User getLoggedUser() {
            return loggedUser;
        }
    
        public boolean userLogging(String userId, String password){
            if (Authenticator.validate(userId, password)) {
                loggedUser = User.of(userId);
                gotoProfile();
                return true;
            } else {
                return false;
            }
        }
    
        public void userLogout(){
            loggedUser = null;
            gotoLogin();
        }
    
        private void gotoProfile() {
            try {
                replaceSceneContent("profile.fxml");
            } catch (Exception ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        private void gotoLogin() {
            try {
                replaceSceneContent("login.fxml");
            } catch (Exception ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    
        private Parent replaceSceneContent(String fxml) throws Exception {
            Parent page = (Parent) FXMLLoader.load(App.class.getResource(fxml), null, new JavaFXBuilderFactory());
            Scene scene = stage.getScene();
            if (scene == null) {
                scene = new Scene(page, 700, 450);
                scene.getStylesheets().add(App.class.getResource("demo.css").toExternalForm());
                stage.setScene(scene);
            } else {
                stage.getScene().setRoot(page);
            }
            stage.sizeToScene();
            return page;
        }
    }
    
    0 讨论(0)
提交回复
热议问题