JavaFX:在 UI 屏幕之间导航的最佳实践

Posted

技术标签:

【中文标题】JavaFX:在 UI 屏幕之间导航的最佳实践【英文标题】:JavaFX: Best practice for navigating between UI screens 【发布时间】:2017-04-06 15:21:30 【问题描述】:

我想将 UI 屏幕从 login.fxml 更改为 home.fxml

我应该更改Stage 还是Scene?我不确定哪个是最佳做法? 另外,我可以为控制器中的处理程序使用 lambda 表达式吗?

【问题讨论】:

请发minimal reproducible example。 我请求了一个示例来演示该问题,因为我想知道您到目前为止已经尝试过什么。这是一个我希望您可以通过一些介绍性教程或稍作修改来回答自己的问题。 【参考方案1】:

首先,让我们从Stage .vs 开始。 Scene问题:

众所周知,JavaFX 层次结构基于:Stage -> Scene -> Nodes(等)。

看这里:

实际上,在我看来,经验法则是未来

如果您打算在程序流程(例如登录 -> 配置文件)中继续前进到不同的位置 - 更改 Stage

如果您在同一个环境(第一次登录 -> 多次错误尝试后登录)- 更改Scene

至于 lambdas:Ahhmmm...如果您当前的 Java/JavaFX 版本有能力 - 没有理由不使用。 有关控制器处理程序的更多信息 Java 8,请参阅great tutorial。

【讨论】:

谢谢!我现在可能会坚持使用 Old-School 版本,因为我正在开始并在以后对 JavaFX 更熟悉时实现 lambdas【参考方案2】:

我在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 对象。

【讨论】:

以上是关于JavaFX:在 UI 屏幕之间导航的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

Android最佳实践之高效的应用导航

Android最佳实践之UI

ios 最佳实践 - 导航和选项卡控制器以及推送/弹出

适用于 Linux 的 java fx 应用程序构建工具的最佳实践

什么是 NSManagedObjectContext 最佳实践?

如何构建 HTML/JS iPad 应用程序以获得最佳性能?