我熟悉JavaFX。我已经创建了一个loginStage和一个mainStage。当按下loginStage上的"Login"按钮时,我想切换到mainStage。loginStage比mainStage小得多。我希望mainStage的位置是这样的,即前loginStage被定位在mainStage的正中间(如果我们没有关闭它)。
我设法从loginStage切换到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
。我想问你:在不同阶段之间切换的最佳实践是什么?这样我就不会一遍又一遍地复制相同的代码了?
我想明白了——是的,我很抱歉,这个问题似乎以前已经回答过了。
问题是.getWidth()
或.getHeight()
方法只能在.show()
方法之后调用。因此,要么改变调用函数的顺序。这工作得很好- mainStage似乎从一开始就处于正确的x,y坐标。但是为了确保它在显示舞台后不会被移动到那里,我们也可以在.fxml文件中查找mainStage的宽度和高度,然后分别在.setX()
和.setY()
中减去这些值。