1

I'm starting with JavaFX on a new application and I want to get a layout on screen identical to WPF's UniformGrid. There's TilePane but it's different (similar to WrapPanel I guess).

My approach so far would be (for a collection [size = N] I want to display as "tiles"):

  1. Use a TilePane t.
  2. t.setPrefRows( ROUNDUP( sqrt(N)))

That's probably not the best approach. Do you know a better solution? Maybe a resizable one?

4

1 回答 1

2

听起来你想要一个布局:

  1. 每行有固定数量的单元节点。
  2. 每个单元节点具有相同的高度和宽度。

我不熟悉 WPF 或 UniformGrid,但我认为以上是您想要的。

TilePane 可能不太适合

看起来TilePane很适合这个,但是,正如您所发现的,它并没有真正表现出这种开箱即用的行为。使用 TilePane,您可以设置首选的行数,但是当您调整 TilePane 的大小时,行数和列数会随着瓷砖重新排列以适应可用区域而改变。

使用具有绑定和首选项设置或约束的 GridPane

要获得每行固定数量的单元格,请使用GridPane。GridPane 在调整大小时将保持固定数量的行和列。为确保每个单元格节点具有相同的高度和宽度,您可以监听 GridPane 的高度和宽度属性,并在更改时设置子元素的最小/最大/首选大小,以便它们都具有相同的大小. 或者对 GridPane 的行和列设置一些约束,例如setPercentWidthsetPercentHeight

为了演示这种方法,ColorChooser 示例为可调整大小的ColorChooser 提供了一些代码,每个网格行具有固定数量的颜色样本,并且随着包含网格的整体增长或缩小,颜色样本会增长和缩小以适应可用区域:合适的。颜色样本本身不一定保持相同的高度/宽度比,但您可以通过在子元素上设置适当的最小/最大/首选大小轻松实现这一点。

小网格  中网格

创建自己的布局

作为使用更改侦听器和在子级上设置最小/最大/首选大小的替代方法,您可以通过将Pane子类化以创建 UniformGrid 类并实现layoutChildren方法来实现自己的布局管理器。在 layoutChildren 中,根据需要排列 UniformGrid 子项的大小和位置。您可以参考现有 Pane 的源代码来查找如何创建自己的布局的示例。

调查第 3 方布局

ControlsFX 项目有一个GridViewMigLayout,它们可能提供 UniformGrid 的功能。

于 2013-06-11T23:46:37.113 回答