2016-11-22 13 views
4

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

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

+0

Пожалуйста, отправьте сообщение [MCVE]. – DavidS

+0

Я попросил пример, демонстрирующий проблему, потому что я хочу знать, что вы пробовали до сих пор. Это вопрос, который я ожидаю, что вы сможете ответить самим через некоторые вводные уроки или немного поработать с вашей стороны. – DavidS

ответ

7

Прежде всего, давайте начнем с Stage .vs. Scene вопрос:

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

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

enter image description here

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

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

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

Что касается лямбд: Ahhmmm ... если текущая версия Java/JavaFX имеет abillity - нет никаких причин, чтобы не использовать. Подробнее о обработчиках контроллера в Java 8 см. Это great tutorial.

+0

Спасибо! Я, вероятно, буду придерживаться версии для старой школы, поскольку я начинаю и реализую lambdas позже, когда мне больше нравится JavaFX –

0

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