7

当使由 GridBagLayout 管理的布局的各个组件不可见时,布局中其余组件的排列会不断变化。GridBagLayout 似乎会“折叠”具有不可见组件的单元格,从而导致其他组件更改位置。这是一种非常烦人的行为,我一直在寻找一种方法来阻止它这样做。

我尝试过的一种方法是在同一个单元格中添加一个垫片,其固定大小等于可能隐藏的组件的首选大小,但如果该首选大小发生变化,那将是很多麻烦保持垫片同步。有没有更好的办法?

实际上,如果 GridBagLayout 真的完全不考虑具有不可见组件的单元格,那也不会那么糟糕,但它仍然会考虑单元格的 insets,所以如果您有输入字段的布局并使用 insets 以常规方式整齐排列它们之间的间隙,然后将一个组件隐藏在中间将其从布局中删除但留下间隙,这通常意味着周围的组件流在一起,但它们之间有一个丑陋的两倍宽的间隙......

4

4 回答 4

8

使用 JPanel(或 Box)作为占位符怎么样?
将 JPanel 放入每个单元格并将组件添加到面板中。如果您使组件不可见,则面板应该仍然存在...

于 2010-01-21T13:33:20.817 回答
1

一种可能性是使用带有CardLayout的嵌套面板来隐藏组件,而不是将它们设置为不可见。CardLayout 使面板始终具有最大“卡片”的大小。

或者,您可以尝试使用新的(从 Java 6 开始)GroupLayout而不是 GridBagLayout - 它在 IMO 上更易于使用并且几乎同样强大。

于 2010-01-21T10:47:28.007 回答
1

使用MigLayout

带回布局的乐趣^^。

我过去也使用过 GridBagLayout,这很糟糕。大量的样板代码,如果你添加一个小组件,布局很可能是搞砸的。

另一种选择是使用Boxlayout

于 2010-01-21T11:30:21.980 回答
0

IIRC,我过去所做的是将组件放置在模仿原始组件大小的容器(或使用单独的组件)中,而不是隐藏状态。将它放在网格包的方法或外观中,您的布局代码可以保持整洁。

于 2010-01-21T13:52:21.453 回答