在JavaFx2和MigLayout 4.2中调整舞台大小以适应其子节点

时间:2014-05-29 08:51:51

标签: javafx javafx-2 fxml miglayout

我有一个应用程序,我们管理多个屏幕。为了做到这一点,我们有下一个代码(我将只添加重要的方法)。

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,其中海报解释了相同的解决方案。

1 个答案:

答案 0 :(得分:2)

stage.sizeToScene()

  

设置此窗口的宽度和高度以匹配此窗口场景内容的大小。