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

问题描述 投票:0回答:3

我想将 UI 屏幕从

login.fxml
更改为
home.fxml

我应该更改

Stage
还是
Scene
?我不确定哪个是最佳实践? 另外,我可以在控制器中的处理程序中使用 lambda 表达式吗?

java javafx fxml scene stage
3个回答
17
投票

首先,让我们从

Stage
.vs 开始。
Scene
问题:

众所周知,

JavaFX
层次结构基于:
Stage
->
Scene
->
Nodes
(等等)。

看这里:

enter image description here

实际上来说,我认为的经验法则是未来

  • 如果您计划在程序流程中转到不同的地方(例如登录 -> 个人资料) - 更改

    Stage

  • 如果您处于相同的环境(首次登录->多次错误尝试后登录)-更改

    Scene

至于 lambdas:啊嗯...如果您当前的

Java
/
JavaFX
版本具有该功能 - 没有理由不使用。 有关控制器处理程序的更多信息,请参见 Java 8,请参阅这个很棒的教程


6
投票

我使用这种方法来改变

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


0
投票

如果您没有特殊原因打开另一个窗口(对话框除外),我更愿意交换场景的根父级。例如:

stage.getScene().setRoot(newParent);

不知道为什么,过渡过程中好像更流畅了。每当我交换场景时,我的应用程序都会闪烁黑色一秒钟。但通过交换它的根,我没有闪烁。

© www.soinside.com 2019 - 2024. All rights reserved.