JavaFX как сменить сцену

m используя Netbeans 7.2 с Scene Builder 1.0 для разработки приложения JavaFX. У меня настроен главный экран, и я хочу, чтобы я нажал кнопку, иЯ закрою главное окно и открою другое. Основной объект Stage находится в главном классе, но класс контроллера является отдельным и можетт доступ к нему, так какне статично и в другом классе. Как мне изменить сцену или сцену?

Ответы на вопрос(4)

Модифицируйте свой controller.java таким образом

Stage thisStage;

public void setStage (Stage stage){
    thisStage = stage;
}

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

Важно, чтобы ты неИспользуйте этот этап в методе инициализации.

Измените свой основной класс следующим образом:

@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();
}

Вы можете скачать пример проекта (NetBeans)Вот.

 ConquerorsHaki09 янв. 2017 г., 15:40
ссылка битая, можешь дать как другую?

недавно я работал над разработкой iOS NavigationController для JavaFX, эквивалентного iOS, используя простейшую идею представления push и dismiss.

Позвольте мне поделиться кодом с сообществом:https://github.com/jalopezsuarez/javafx-screens

Идея состоит в том, чтобы создать очень простую среду для переключения между экранами.

Надеюсь, это поможет вам.

(В этом примере я перехожу с Login.fxml на Home.fxml).

Внутри класса LoginController.fxml я создал следующий метод:

@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");
    }
}

И этосидеть.;)

 Hamid Shariati28 мар. 2018 г., 21:02
именно то, что я хотел ...
Решение Вопроса

Скачать образцы JavaFX найти проект FXML-LoginDemo, который 'Это то, что вам нужно. Для быстрого ознакомления я скопирую основной класс Java здесь;)

/*
 * Copyright (c) 2008, 2011 Oracle and/or its affiliates.. 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;
    }
}
 ConquerorsHaki09 янв. 2017 г., 15:29
Как я могу использовать это в классе контроллера? Или я могу использовать это только в основном приложении?
 Tyler Petrochko22 окт. 2012 г., 14:56
Спасибо, это именно то, что я искал!
 user258231816 окт. 2015 г., 08:26
это правильно в наши дни? Я имею в виду, могу ли я использовать это и вызвать вне класса приложения .replaceSceneContent? или сегодня (2015 год) есть ли правильный способ изменения между этапами? спасибо =)
 invariant17 янв. 2013 г., 15:23
обновлена неработающая ссылка :)

Ваш ответ на вопрос