JavaFX setOnShown在窗口可见之前激发
我试图将窗口的最小高度设置为它包含的场景的高度+标题栏的高度(因此在显示窗口后,不可能再缩小它)。我写了以下答案:JavaFX setOnShown在窗口可见之前激发,javafx,Javafx,我试图将窗口的最小高度设置为它包含的场景的高度+标题栏的高度(因此在显示窗口后,不可能再缩小它)。我写了以下答案: stage.setOnShown(event -> { stage.setMinHeight(stage.getHeight()); }); 但它似乎不起作用,因为当触发事件时,窗口甚至没有显示在屏幕上,其高度仍然等于场景的高度(不考虑标题栏)。然后,我的问题是-当窗口在屏幕上实际可见时,如何运行代码?您可以强制布局场景的根,然后根据场景大小调整舞台的大小: s
stage.setOnShown(event -> {
stage.setMinHeight(stage.getHeight());
});
但它似乎不起作用,因为当触发事件时,窗口甚至没有显示在屏幕上,其高度仍然等于场景的高度(不考虑标题栏)。然后,我的问题是-当窗口在屏幕上实际可见时,如何运行代码?您可以强制布局场景的根,然后根据场景大小调整舞台的大小:
stage.setOnShown(e -> {
stage.getScene().getRoot().layout();
stage.sizeToScene();
stage.setMinHeight(stage.getHeight());
});
这里有一个SSCCE:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class StageSizeTest extends Application {
@Override
public void start(Stage primaryStage) {
primaryStage.setOnShown(e -> {
primaryStage.getScene().getRoot().layout();
primaryStage.sizeToScene();
System.out.printf("[%.1f, %.1f]%n", primaryStage.getWidth(), primaryStage.getHeight());
primaryStage.setMinWidth(primaryStage.getWidth());
primaryStage.setMinHeight(primaryStage.getHeight());
});
VBox root = new VBox(10,
new Label("Test one"),
new Label("Another test"),
new Label("Another really long label to give the scene some width"),
new Label("Bottom label"));
root.setPadding(new Insets(10));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
您正在寻找
sage.sizeToScene()代码>方法?设置此窗口的宽度和高度以匹配此窗口场景内容的大小。谢谢,我不知道此方法。但问题不在于调整窗口大小,而在于对其最小大小施加约束。@asdfzcx-Strange;这对我来说很好;不能将窗口的大小减小到原始大小以下。您使用的是什么平台(操作系统和JDK版本)?我使用的是Linux(发行版-Solus)和OpenJDK1.8.0121。@是的。。。嗯,我在我的Mac电脑上编写并测试了它,它运行得很好。我刚刚在我的Ubuntu盒上试用过,效果和你展示的一样。它看起来像窗口的高度在显示后的某个点发生变化;就像将高度设置为场景的高度一样,然后进行调整以包括标题栏的高度。我不确定什么样的解决方法可以:我只能想出一些技巧(比如等待一小段时间,设置延迟后的最小高度,或者类似的)。