是否可以使用GridBagLayout管理器完全模拟GridLayout的行为?
基本上,我有一个8x8网格,其中每个单元格应具有相同的宽度和高度。 GridLayout自动执行此操作。但我想在网格中添加另一行和列,其大小与其他不一样。该行/列应占用可能遗留的所有剩余空间(因为可用大小无法均等地分配到8个单元中)。这是可能的,还是我 - 再次 - 必须使用不同的布局管理器?
这是我想要实现的简单图形,简化为4个单元格:
有色单元格是我添加到实际网格(灰色)的单元格,其中单元格具有相同的高度和宽度x
。因此网格的高度和宽度为4*x
。我现在希望其他单元格具有必要的宽度/高度(minimumSize)加上完整尺寸的可用宽度/高度的其余部分。
如果更改整个面板的大小,灰色网格单元应该再次占用尽可能多的空间。
答案 0 :(得分:3)
将固定单元格的weightx
的{{1}}和weighty
设置为GridBagConstraints
,将0
设置为fill
。对于将NONE
设置为fill
的浮动单元格,对于应仅展开水平设置为BOTH
至weightx
的浮动单元格,对于垂直展开的设置为1
的浮动单元格到weighty
。
细胞只有在有任何内容时才会展开,因此您需要填充一些内容。我选择1
s并为固定单元格中的标签设置固定尺寸。调整大小时,您需要重新计算尺寸并调用JLabel
重新计算布局。
以下是invalidate()
x w
网格的示例:
h
答案 1 :(得分:1)
如果你没有必然绑定GridBagLayout,你应该查看MigLayout库。你可以按照以下方式做点什么:
MigLayout layout = new MigLayout(
"", // Layout Constraints
"[10][10][10][10]", // Column constraints
"[10][10][10][10]"); // Row constraints
答案 2 :(得分:0)
所有值均在GridBagConstraints
。
如果您希望修复8x8网格,可以设置ipadx
和ipady
值。
然后将新行/列的weightx
和weighty
值设置为1.0
,并将fill
设置为FULL
。
您的额外行/列将展开剩余的空间。
如果你想要扩展8x8网格,那就更复杂了。除了ipadx
和ipady
值之外,您还可以调整weightx
和weighty
值。或者为8x8网格制作一个面板,并在那里使用GridLayout
。使用面板上的GridBagLayout
和其他行/列。
答案 3 :(得分:0)
你有没有理由不在JTable中这样做?看起来就像它所做的那样。使用适当的单元格渲染器,您可以在单元格中放置任何内容。
http://www.java2s.com/Code/Java/Swing-Components/TableRowHeaderExample.htm
答案 4 :(得分:-2)
在使用内置布局管理器尝试了许多不同的事情之后,我决定为这个问题创建一个自定义布局管理器。我还没有这样做,因为我没有时间继续这个项目,但是当我完成它时,我会确保在这里发布布局管理器代码,以便任何对类似解决方案感兴趣的人可以使用它。
didxga 在评论中提醒我,我想发布我的解决方案。然而,在从后面挖掘项目并查看它之后,我实际上无法发布我的解决方案,因为事实证明我从来没有创建它!
这是一个单一的项目,于2010年9月中旬正式完成。我们实际上想继续研究它,这可能就是为什么我说我会发布它(因为这是我想改进的一件事),但我们从来没有真正做到这一点 - 遗憾的是。相反,我只是省略了那些额外的列和行(这意味着行/列btw的标签)。
所以是的,我非常抱歉我不能发布一个我最初想要的布局... :(也许如果有足够的请求这样的布局,我会创建它,但截至目前,我不是真的愿意再次深入Java布局;)