JavaFX: Лучшая практика для навигации между экранами пользовательского интерфейса
Я хочу изменить экраны пользовательского интерфейса с login.fxml
до home.fxml
.
должен ли я изменить Stage
или Scene
? Я не уверен, что это лучшая практика?
Кроме того, можно ли использовать лямбда-выражение для обработчика в контроллере?
2 ответов
во-первых, давайте начнем с Stage
.против Scene
вопрос:
как известно,JavaFX
иерархия основана на: Stage
->Scene
->Nodes
(и т. д.).
смотрите здесь:
практически говоря, эмпирическое правило, на мой взгляд,будущее:
если вы планируете идти вперед к другому место в потоке вашей программы (логин - >профиль, например) - изменить
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
объект в сохраненных