【发布时间】:2014-02-11 17:07:15
【问题描述】:
我决定为我的 Java Swing 应用程序使用 GridLayoutLayoutManager,因为网格中的每个单元格都应该具有完全相同的大小。
GridLayout 对象将组件放置在单元格网格中。每个组件占用其单元格内的所有可用空间,并且每个单元格的大小完全相同。
甚至在GridLayout类的描述中:
GridLayout 类是一个布局管理器,它在矩形网格中布置容器的组件。容器被分成大小相等的矩形,每个矩形中放置一个组件。
但是,我的代码似乎使某个单元格比其他单元格大一倍。我将 3 个JPanels 添加到带有GridLayout 的Container,并为每个JPanel 赋予不同的背景颜色。结果是这样的:
显然,第一个 JPanel(红色背景)是其他 JPanel(绿色和黄色)的两倍。产生这个的代码如下:
public void updateListFrameContentPane(Container mainPane) {
mainPane.setLayout(new GridLayout(1,0));
JPanel listPanel = new JPanel();
listPanel.setLayout(new BoxLayout(listPanel, BoxLayout.Y_AXIS));
listPanel.add(friendsLabel);
listPanel.add(listScrollPane);
listPanel.setBackground(Color.RED);
mainPane.add(listPanel);
for(JPanel chatPanel : chatPanels) {
chatPanel.setBackground((Math.random()>0.5 ? Color.YELLOW : Color.GREEN));
mainPane.add(chatPanel);
}
}
我所做的只是将Container's 布局设置为GridLayout,其中包含1 行和任意数量的列,然后添加3 JPanels。那么为什么第一个 JPanel 这么大呢?奇怪的是,这只发生在添加两个或更多chatPanels 时。当只有一个时,它的格式正确。
【问题讨论】:
-
它们应该并且通常与文档中所说的大小相同。您是否在窗口可见后添加组件?如果是这样,你
revalidate()布局了吗? -
你是在用其他方法给
mainPane添加组件吗? -
@JohnGaughan 不,每次我想添加组件时都会运行此方法
-
@kiheru 是的,我是。 revalidate() 有什么作用?我在
GridLayout中找不到方法@ -
是的,GridLayout 中的单元格大小是否相同。重新发布问题 (stackoverflow.com/q/21244363/131872) 不会帮助您获得答案。而是发布一个正确的MVCE 来证明问题。大多数时候,当您尝试创建 MVCE 时,您会解决自己的问题。