JavaFX中的VBox和HBox布局

4
我正在开发一个JavaFX应用程序,其布局是从外部数据结构生成的,包含以下内容:
显示知道其宽高比(高度作为宽度的依赖项)的组件 两种类型的结构组件 在页面上显示所有子元素,并使每个子元素占据所需的垂直空间 在页面上向下显示所有子元素,使用全部宽度并占据所需的垂直空间
但我发现显示结果与我的预期不符。我创建了一个简化的案例来演示问题。
下面是代码,问题在于v3没有被显示出来,我无法弄清楚原因。我想这可能与VBox和HBox的某些方面有关,但我还没理解透彻。
非常感谢任何帮助或想法。提前致谢!
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

import java.util.Random;

public class Test extends Application {

    static Random rand = new Random();

    public static void main(String args[]) {
        Application.launch("something");
    }

    @Override
    public void start(Stage mainStage) throws Exception {
        testVBoxes(mainStage);
    }

    private void testVBoxes(Stage mainStage) {
        VBox root = new VBox();
        Scene one = new Scene(root, 800, 600, Color.WHITE);

        FixedAspectRatioH h1 = new FixedAspectRatioH();
        FixedAspectRatioH h2 = new FixedAspectRatioH();
        FixedAspectRatioH h3 = new FixedAspectRatioH();
        FixedAspectRatioV v1 = new FixedAspectRatioV();
        FixedAspectRatioV v2 = new FixedAspectRatioV();
        FixedAspectRatioV v3 = new FixedAspectRatioV();

        h1.prefWidthProperty().bind(root.widthProperty());

        h2.add(v2);

        v1.add(h3);
        v1.add(h2);

        h1.add(v1);
        h1.add(v3);

        root.getChildren().add(h1);

        mainStage.setScene(one);
        mainStage.show();
    }

    private class FixedAspectRatioV extends VBox {
        public FixedAspectRatioV() {
            Rectangle r = new Rectangle();
            r.setFill(Color.rgb(rand.nextInt(256), rand.nextInt(256),     rand.nextInt(256)));
            r.widthProperty().bind(widthProperty());
            r.heightProperty().bind(r.widthProperty().divide(3));
            getChildren().add(r);
        }

        public void add(Region n) {
            n.prefWidthProperty().bind(widthProperty());
            getChildren().add(n);
        }
    }

    private class FixedAspectRatioH extends HBox {
        public FixedAspectRatioH() {
            Rectangle r = new Rectangle();
            r.setFill(Color.rgb(rand.nextInt(256), rand.nextInt(256),     rand.nextInt(256)));
            r.widthProperty().bind(widthProperty().divide(4));
            r.heightProperty().bind(r.widthProperty());
            getChildren().add(r);
        }

        public void add(Region n) {
            HBox.setHgrow(n, Priority.ALWAYS);
            getChildren().add(n);
        }
    }
}

不清楚您对应用程序的想法是什么,但似乎您在布局方面遇到了麻烦。尝试在舞台显示后(mainStage.show()之后)使用root.requestLayout()。或者尝试使用prefWidthProperty来绑定而不是V|HBoxes的widthProperty - Uluk Biy
调用 root.requestLayout() 可以修复布局 - 但为什么需要这样做呢?对我来说,这似乎是一种hack,因此我想知道是否有避免调用的方法。使用 predWidthProperty 而不是 widthProperty 会导致什么都不显示。 - hcarver
1个回答

0

已经过去了2年,但解决方案是你忘记了

Node.setPrefSize(width,height);

并且在你的构造函数中添加以下代码 Hbox.setFillHeight(true);


1
哇,太棒了,感谢你找到并回答了这个问题。我没有办法检查它是否正确,所以除非有其他人说它不起作用,否则我会接受它。 - hcarver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接