gpt4 book ai didi

JavaFX - 将阶段大小绑定(bind)到根节点的首选大小

转载 作者:行者123 更新时间:2023-11-29 04:45:11 24 4
gpt4 key购买 nike

每当 Scene 的根节点的首选宽度/高度发生变化时,我想自动调整 javafx.stage.Stage 的宽度/高度。

这是一个包含多个 javafx.scene.control.TitledPane 的小型实用程序窗口(用户无法调整大小),并且当其中一个 TitledPanes 展开时窗口的高度应该增加(否则 TitlePane 的内容可能超出范围)。

不幸的是,我只能找到 javafx.stage.Window.sizeToScene(),它最初将窗口的大小设置为根的首选大小。

有没有办法将舞台大小永久绑定(bind)到根节点大小?

最佳答案

基于 DVarga 的示例,我制定了以下“解决方案”:
InvalidationListener 安装在每个子节点的 heightProperty 上,每个子节点的高度可能会收缩/增长(本例中有两个 TitlePanes)。
heightProperty 无效时,包含窗口的高度将被重新计算(也磨光窗口装饰)。

示例:

public class SampleApp extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
final Label lbl1 = new Label("content");
final TitledPane tp1 = new TitledPane("First TP", lbl1);

final Label lbl2 = new Label("more content");
final TitledPane tp2 = new TitledPane("Second TP", lbl2);

final VBox rootPane = new VBox(tp1, tp2);

tp1.heightProperty().addListener((InvalidationListener) observable -> {
updateWindowHeight(rootPane);
});

tp2.heightProperty().addListener((InvalidationListener) observable -> {
updateWindowHeight(rootPane);
});

final Scene scene = new Scene(rootPane);
primaryStage.setScene(scene);
primaryStage.sizeToScene();
primaryStage.setResizable(false);
primaryStage.show();
}

private void updateWindowHeight(final VBox rootPane) {
final Scene scene = rootPane.getScene();
if (scene == null)
return;
final Window window = scene.getWindow();
if (window == null)
return;
final double rootPrefHeight = rootPane.prefHeight(-1);
final double decorationHeight = window.getHeight() - scene.getHeight(); // window decorations
window.setHeight(rootPrefHeight + decorationHeight);
}

public static void main(String[] args) {
launch(args);
}
}

虽然它按预期工作,但此解决方案存在一些主要缺点:

  • 您必须在每个可能缩小/增大大小的节点上安装监听器
  • 从 CCD 的角度来看,这是完全错误的:子节点不应该负责调整它们所在阶段的大小。

我找不到更干净的解决方案来工作。 javafx.stage.Stagejavafx.scene.Scene 太过阻碍(可能的扩展点是 final 或 package-private),无法在它所属的地方实现此功能。

更新
仅使用 window.sizeToScene() 而不是

final double rootPrefHeight = rootNode.prefHeight(-1);
final double decorationHeight = window.getHeight() - scene.getHeight();
window.setHeight(rootPrefHeight + decorationHeight);

在调整窗口大小时产生的“卡顿”要少得多!

关于JavaFX - 将阶段大小绑定(bind)到根节点的首选大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37472448/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com