可随父级进行缩放的JavaFX布局

可随父级进行缩放的JavaFX布局,java,layout,user-interface,javafx,Java,Layout,User Interface,Javafx,我在一个项目中使用JavaFX而不是Swing,因为增强的多媒体、webviewer和使用视觉效果的可能性。然而,从我在web(和其他网站)上的发现中,我了解到,JavaFX版面管理器专注于根据内容的大小缩放父级的大小,而Swing专注于根据父级缩放内容,至少基于所使用的布局 现在我正在使用一个手风琴,里面有一些标题窗格的孩子。其中一个包含一个GridPane,原因很简单,这是我所知道的模拟GridLayout的最佳方法(正如我从前面的问题中学到的:)。我想将标题窗格的内容分成两行一列,每行的高

我在一个项目中使用JavaFX而不是Swing,因为增强的多媒体、webviewer和使用视觉效果的可能性。然而,从我在web(和其他网站)上的发现中,我了解到,JavaFX版面管理器专注于根据内容的大小缩放父级的大小,而Swing专注于根据父级缩放内容,至少基于所使用的
布局

现在我正在使用一个手风琴,里面有一些
标题窗格
的孩子。其中一个包含一个
GridPane
,原因很简单,这是我所知道的模拟
GridLayout
的最佳方法(正如我从前面的问题中学到的:)。我想将
标题窗格
的内容分成两行一列,每行的高度为
标题窗格
中可用空间的50%(按
阶段
场景
缩放),相当于
边框布局中的
网格布局(2,1)
。为此,我添加了一个
GridPane
,使用
setPercentHeight(50)
添加了2个
RowConstraint
s,使用
setPercentWidth(100)
添加了1个
columnstraint
。但是,我注意到内容与网格的比例适当,但是网格没有占用
标题窗格
中的所有可用空间(因为它显然不像
边框窗格
的中心)。我还尝试了使用
setMaxWidth
使内容与父级一起缩放,但它似乎也不起作用(如这里所说:)。即使会,我是否需要在UI元素树中设置每个子代的最大宽度,以便所有子代都可以缩放

不管是哪种方式,有人知道如何制作一个
标题窗格
,其中每个标题窗格下有两个相等的空间,并与标题窗格的大小成比例吗


事实上,您的网格窗格正在增长,以填充其所有父窗格。 考虑下面的代码,为了调试目的,我在GRIDANE中添加了一个背景颜色(红色)。p>
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);
如果执行此代码,gridpane将填充其所有父项(检查标题窗格内容上的红色范围)

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

ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setFillWidth(true);
columnConstraints.setHgrow(Priority.ALWAYS);
gridPane.getColumnConstraints().add(columnConstraints);

你能告诉我setPercentWidth(100)和setFillWidth(true)+setHgrow(Priority.ALWAYS)之间的区别吗?setPercentWidth也可以工作,而不是setHgrow(Priority.ALWAYS)。如果您只使用一列,它们将执行相同的操作。如果您有多个列,它们的工作方式会有所不同。因为setHGrow将尝试告诉布局gridpane的哪一列需要增长以填充无人认领的可用空间。setFillWidth(true)用于列的内容,而不是列本身。我认为默认值是正确的。所以你不需要设置它。这意味着是否会调整列的子项以填充列的所有宽度。setFillWidth有多深?例如,如果我把一个VBox添加到一个列中,我猜Vbox会占用这个空间,但是需要使用SETMAXFIDENT(双.Max值)来单独地缩放按钮?如果你被卡住了,并且想要强制内容在它的父母中生长,考虑把这些内容包装在一个锚点中。