我有一个应用程序,我们管理多个屏幕。为了做到这一点,我们有下一个代码(我将只添加重要的方法)。
ScreenManager.java
public class ScreenManager extends StackPane {
private final HashMap<String, Node> screens = new HashMap<>();
public boolean showScreen(final String idScreen) {
if (this.screens.get(idScreen) != null) {
if (!this.getChildren().isEmpty()) {
// Hide actual screen and show new one
this.getChildren().remove(0);
this.getChildren().add(0, this.screens.get(idScreen));
} else {
// Show first screen
this.getChildren().add(this.screens.get(idScreen));
}
return true;
}
return false;
}
}
MainApplication.java
@Override
public void start(Stage stage) throws Exception {
// Initialize screenManager
ScreenManager screenManager = ScreenManager.getInstance();
// Here I load my screens into screenManager
final Scene screen = new Scene(screenManager);
stage.setResizable(false);
stage.setScene(screen);
stage.show();
// Show first screen
screenManager.showScreen(IConstants.LOGIN_PAGE);
}
login.fxml
<MigPane id="rootPane" fx:controller="domain.myControllers.LoginController"
styleClass="main-panel"
layout="insets 25"
cols="[label, pref!][grow, ::300]"
rows=""
xmlns:fx="http://javafx.com/fxml">
<Label text="Name" styleClass="label12" /> <TextField fx:id="name" MigPane.cc="growx, wrap" />
<Label text="Password" styleClass="label12" /> <PasswordField fx:id="password" MigPane.cc="growx, wrap" />
<Button text="Enter" onAction="#login" MigPane.cc="skip, gap :push, gaptop 15, wrap" />
<Label fx:id="messageLabel" styleClass="result-message" MigPane.cc="span, growx, gaptop 15, wrap" />
该应用程序工作正常,但当我显示第一个屏幕时,舞台的大小比它应该大很多,每次我更改屏幕,它都没有改变,它保持第一大小
关于如何使其适应实际屏幕的一些想法?
谢谢!
编辑
我发现在定义屏幕之前显示/添加屏幕,舞台会尝试实际调整其内容的大小。
// Show first screen
screenManager.showScreen(IConstants.LOGIN_PAGE);
final Scene screen = new Scene(screenManager);
stage.setResizable(false);
stage.setScene(screen);
stage.show();
但我的 login.fxml 或 MigLayout 仍有问题,因为它显示的是一个小屏幕(或多或少1 * 2厘米)。
我尝试添加下一个布局并且有效:
<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml">
所以问题是,为什么它不适用于MigLayout?为什么不用我的代码定义pref宽度/高度?
EDIT2
添加jewelsea&#39的解决方案我的应用程序渲染第一个屏幕(使用MigPane),其大小正确,但是,其余的屏幕保持这个初始大小,所以如果它们更大,它们就不适合。我不知道它是否是MigPane的错误或StackPane,但在这种情况下它们不合适,JavaFX会尝试将它们渲染得更小,因此标签显示为3个点( ...)和文本字段要小得多。
// Show first screen
screenManager.showScreen(IConstants.LOGIN_PAGE);
final Scene screen = new Scene(screenManager);
stage.setResizable(false);
stage.setScene(screen);
stage.show();
stage.sizeToScene();
所以似乎每次我删除或添加一个孩子到我的StackPane时,它都不会强制调整大小。想法?
EDIT3
显然,有一个issue的MigLayout 4.2和JavaFX会影响调整大小过程。这就是我们必须使用 stage.sizeToScene()的原因。它已经发布了解决问题的MigLayout 5.0,但它不适用于JavaFx2,只有JavaFx8。所以至少有人知道其他的解决方法,我们就是堆栈。
我也尝试在每次 getChildren.add 之后调用 stage.sizeToScene(),但是舞台没有正确调整大小,显示一个小屏幕。
Stackoverflow中还有另一篇文章谈到同一个issue,其中海报解释了相同的解决方案。