JavaFX setOnShown在窗口可见之前触发

时间:2017-05-23 20:27:25

标签: javafx

我正在尝试将窗口的最小高度设置为其包含的场景的高度+标题栏高度(因此在显示窗口后,不可能将其缩小更多)。在this回答后,我写道:

SELECT AcquistionDate = CONVERT(NVARCHAR,
                        CASE 
                           WHEN D.CalendarDate NOT IN ('01/01/1900','12/31/9999') 
                              THEN D.CalendarDate 
                           WHEN ac.FirstAccountOpenDate NOT IN ('01/01/1900', '12/31/9999')  
                              THEN ac.FirstAccountOpenDate 
                        END, 126) + 'Z 
from TABLE;

它似乎不起作用,因为当事件被触发时,窗口甚至没有显示在屏幕上,并且它的高度仍然等于场景的高度(标题栏没有被考虑)。我的问题是 - 当窗口实际上在屏幕上可见时如何运行代码?

1 个答案:

答案 0 :(得分:0)

您可以强制布置场景的根,然后将舞台调整为场景的大小:

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);
    }
}