Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaFX setOnShown在窗口可见之前激发_Javafx - Fatal编程技术网

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盒上试用过,效果和你展示的一样。它看起来像窗口的高度在显示后的某个点发生变化;就像将高度设置为场景的高度一样,然后进行调整以包括标题栏的高度。我不确定什么样的解决方法可以:我只能想出一些技巧(比如等待一小段时间,设置延迟后的最小高度,或者类似的)。