it-swarm.com.ru

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

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

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

8
user4016255

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

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

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

 enter image description here

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

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

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

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

11
MordechayS

Я использую этот подход для смены сцен в 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 в сохраненный объект Stage.

С помощью этого кода вы можете создать основное трехкнопочное меню, где каждая кнопка переключается на другую сцену, используя только один объект Stage.

2
delusionX