首页 > 解决方案 > JavaFX - 切换阶段和新阶段的 setX 和 setY

问题描述

我熟悉JavaFX。我创建了一个 loginStage 和一个 mainStage。当按下 loginStage 上的“登录”按钮时,我想切换到 mainStage。loginStage 比 mainStage 小很多。我希望 mainStage 的位置使得以前的 loginStage 位于 mainStage 的中间(如果我们没有关闭它的话)。

我设法从 loginStage 切换到 mainStage。但是由于某种原因,mainStage 没有正确定位自己;在我看来,它的 X 和 Y 坐标根本没有设置!

这是我的代码:

 public void switchWindow() {
        FXMLLoader loader = new FXMLLoader();
        try {
            Stage loginStage = (Stage) btnLogin.getScene().getWindow();
            loginStage.setScene(null);
            loginStage.hide();

            Pane mainPane= (Pane) loader.load(getClass().getResource("/mainStage.fxml"));
            Stage mainStage= new Stage();
            mainStage.initStyle(StageStyle.TRANSPARENT);
            Scene mainScene= new Scene(mainPane);
            mainStage.setScene(mainScene);

            mainStage.setX(loginStage.getX() + loginStage.getWidth()/2 - mainStage.getWidth()/2);
            mainStage.setY(loginStage.getY() + loginStage.getHeight()/2 - mainStage.getHeight()/2);

            mainStage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

另外:我会创造更多的舞台。因此,我认为switchWindow()在单独的包中创建一个函数可能是个好主意。我可能只是用参数调用函数oldStage and newPane。我想问你:在阶段之间切换的最佳做法是什么?这样我就不会一遍又一遍地重现相同的代码?

标签: javauser-interfacejavafx

解决方案


我想通了 - 是的,我很抱歉,这似乎已经被回答过。

问题是.getWidth()or.getHeight()方法只能在方法之后调用.show()。因此,要么改变调用函数的顺序。这工作正常 - mainStage 似乎从一开始就处于正确的 x,y 坐标。但是为了确保它不会在显示舞台后移动到那里,我们也可以在 .fxml 文件中查找 mainStage 的宽度和高度,然后分别减去这些.setX().setY()


推荐阅读