如何正确制作嵌套的 JavaFX GridPanes 布局?

Posted

技术标签:

【中文标题】如何正确制作嵌套的 JavaFX GridPanes 布局?【英文标题】:How to make nested JavaFX GridPanes layout correctly? 【发布时间】:2012-11-05 20:44:08 【问题描述】:

上下文:我正在使用 java1.7.0_07 和 Jython 构建 JavaFX 应用程序。我的应用程序有一个 ScrollPane,其中包含一个 GridPane,该 GridPane 包含可变数量的 GridPane。每次 TreeView 选择更改时,我的应用程序丢弃并重建最里面的 GridPanes

问题:当我在 TreeView 中选择某些内容时,最里面的 GridPane巨大,将除了第一个最里面的 GridPane 之外的所有内容都推到了 ScrollPane 的可视区域之外。无论如何,ScrollPane 不显示滚动条,给人的印象是只有一个最里面的 GridPane 对象。手动调整包含 ScrollPane '修复' 的窗口的大小!从我添加它们的那一刻起,如何让最里面的 GridPanes 成为那个大小?

当然,我尝试的第一件事是在 Jython 解释器的外部 GridPane 上调用 requestLayout(),这与调整包含窗口的大小一样有效。这也是我发现最里面的 GridPanes 很大的原因——我在每个最里面的 GridPanes 上都调用了getBoundsInParent()

但是,在我的 ChangeListener.changed() 实现中,一切都不同了。调用requestLayout() 似乎没有任何作用。此外,我每个最里面的 GridPanes 的边界都是[0,0,0,0]!看起来这里发生了一些异步操作,但我是 JavaFX 新手,我不知道是什么。

更新:越来越近了!每个最里面的 GridPanes 都包含一个Label,我在每个标签上调用setWrapText(true)如果我没有在标签上启用换行,布局会正确运行!如果我在每个标签上调用 setPrefHeight(40),即使启用了文本换行,布局也会正确运行,但我真的不喜欢这个想法试图猜测一个合适的首选高度来分配给我的每个标签。我只希望标签以我“摆动”包含窗口时它们假设的边界开始。但是怎么做呢?

【问题讨论】:

你试过 Platform.runLater(new Runnable() @Override public void run() requestLayout(); ); 确实尝试过,但没有结果。从 Timer 调用 requestLayout() 有效。 【参考方案1】:

每个最里面的GridPane 对象都有一个ColumnConstraints 对象,其中percentWidth100。删除将这个(不必要的)ColumnConstraints 对象添加到最里面的 GridPane 对象的代码修复了仅当包含的 Label 对象将 wrapText 设置为 true 时出现的布局错误行为。

【讨论】:

以上是关于如何正确制作嵌套的 JavaFX GridPanes 布局?的主要内容,如果未能解决你的问题,请参考以下文章

Javafx 中 GridPane 中的 HBox

如何在 JavaFX 的 GridPane 中删除“幽灵线”?

如何在 JavaFX 中交换两个 GridPane 节点?

JavaFX中GridPane的行居中对齐

如何使用 GridPane JavaFX 使按钮跨越多个列/行?

如何在 JavaFX GridPane 的列之间设置填充?