9

由于增强的多媒体、网络查看器和使用视觉效果的可能性,我在项目中使用 JavaFX 而不是 Swing。但是,我从网上发现的内容(http://docs.oracle.com/javafx/2/layout/jfxpub-layout.htm等)中了解到,JavaFX布局管理器专注于缩放父级基于内容的大小,而Swing专注于根据父级缩放内容,至少基于Layout正在使用的内容。

现在我正在Accordion和一些TitledPane孩子一起使用。其中一个包含 a GridPane,原因很简单,它是我所知道的模拟 a 的最佳方式GridLayout(正如我从之前的问题中了解到的:JavaFX 布局相当于 GridLayout)。我希望将TitledPane' 的内容分成 2 行和 1 列,每行具有 50% 的可用空间高度(用orTitledPane缩放),相当于 a inside a将完成的工作。为此,我添加了一个with 2 s using和 1 with . 但是,我注意到内容随着网格正确缩放,但网格并没有占用所有可用空间StageSceneGridLayout(2,1)BorderLayout.CENTERGridPaneRowConstraintsetPercentHeight(50)ColumnConstraintsetPercentWidth(100)TitledPane(因为显然它不像BorderPane' 中心)。我也尝试过setMaxWidth使内容与父级一起缩放,但它似乎也不起作用(如此处所述:JavaFX:如何使我的自定义组件使用父级布局中的所有可用空间?)。即使可以,我是否需要在我的 UI 元素树中将最大宽度设置为每个后代以使它们全部缩放?

无论哪种方式,有没有人知道如何制作一个TitledPane在它下面有 2 个相等的空格,并与标题窗格的大小一起缩放?

列宽不占用所有可用空间

4

1 回答 1

10

事实上,您的网格窗格正在增长以填充其所有父级。考虑下面的代码,我在网格窗格中添加了背景颜色(红色)以进行调试。

Accordion accordion = new Accordion();
TitledPane titledPane = new TitledPane();
titledPane.setText("Title");
GridPane gridPane = new GridPane();
gridPane.setStyle("-fx-background-color:red");

gridPane.add(new TextArea("Hello"), 0, 0);
gridPane.add(new TextArea("World"), 0, 1);

titledPane.setContent(gridPane);
accordion.getPanes().add(titledPane);

如果执行此代码,网格窗格将填充其所有父级(检查红色跨越整个标题窗格内容)。

但是,网格窗格的内容不会填满所有列。如果您尝试调整窗口大小,您将看到 textareas 的宽度没有随着网格窗格的变化而变化。要解决这个问题,您需要告诉网格窗格的第一列与网格窗格本身一起增长。这样做的方法是添加以下约束:

ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setFillWidth(true);
columnConstraints.setHgrow(Priority.ALWAYS);
gridPane.getColumnConstraints().add(columnConstraints);
于 2013-10-04T07:24:22.993 回答