JavaFX: Лучшая практика для навигации между экранами пользовательского интерфейса

Я хочу изменить экраны пользовательского интерфейса с login.fxml до home.fxml.

должен ли я изменить Stage или Scene? Я не уверен, что это лучшая практика? Кроме того, можно ли использовать лямбда-выражение для обработчика в контроллере?

2 ответов


во-первых, давайте начнем с Stage .против Scene вопрос:

как известно,JavaFX иерархия основана на: Stage ->Scene ->Nodes (и т. д.).

смотрите здесь:

enter image description here

практически говоря, эмпирическое правило, на мой взгляд,будущее:

  • если вы планируете идти вперед к другому место в потоке вашей программы (логин - >профиль, например) - изменить Stage.

  • если вы находитесь в той же окружающая среда (войти в первый раз - > войти после нескольких неправильных попыток) - изменить Scene.

что касается лямбды: эм-м-м... если ток Java/JavaFX версия имеет способность - нет причин не использовать. Подробнее о обработчиках контроллеров в Java 8, см. Это большой учебник.


Я использую этот подход для изменения сцен в 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) { }

поэтому в основном, когда вы нажимаете кнопку, она сохраняет фактически отображается Stage объект stage переменной. Затем он загружает новый Scene объект .файл fxml в myNewScene переменная, а затем поместите этот свежий загруженный Scene объект в сохраненных