【发布时间】:2013-09-08 19:29:25
【问题描述】:
我正在尝试使用以下面板布局创建 UI:
但是,当我用图像(在 JLabels 上)填充白色面板时,会发生以下情况:
问题是图像本身没有调整大小以使面板“适合”吗?如果是这样,是否可以轻松调整它们的大小,还是我必须找到 GridBag 分配给它的大小,然后根据该大小缩放每个图像?
编辑:我在这里尝试做的是在我实际添加图像时保持面板 1(白色)与第一张图片中的大小相同。 我不希望面板调整大小并接管其他一些面板。
GridBagLayout gb = new GridBagLayout();
gb.columnWeights = new double[] {0.25,0.25,0.25,0.25};
gb.rowWeights = new double[] {0.5,0.5};
setLayout(gb);
GridBagConstraints gc = new GridBagConstraints();
gc.fill = GridBagConstraints.BOTH;
gc.gridx = 0;
gc.gridy = 0;
gc.gridwidth = 3;
add(new WhitePanel(), gc);
gc.gridx = 3;
gc.gridy = 0;
gc.gridwidth = 1;
add(new RedPanel(), gc);
gc.gridx = 0;
gc.gridy = 1;
gc.gridwidth = 1;
add(new GreenPanel(), gc);
gc.gridx = 1;
gc.gridy = 1;
gc.gridwidth = 2;
add(new BluePanel(), gc);
gc.gridx = 3;
gc.gridy = 1;
gc.gridwidth = 1;
add(new YellowPanel(), gc);
以下是我的 WhitePanel 构造函数:
public WhitePanel()
{
setBackground(new Color(1f,1f,1f,1f));
setLayout(new GridBagLayout());
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = 0;
gc.gridy = 0;
gc.weightx = 1;
gc.weighty = 1;
gc.anchor = GridBagConstraints.CENTER;
for (int type = 0; type < 4; type++)
{
for (int tier = 0; tier < 7; tier++)
{
gems[type][tier] = new D3Gem(type, tier, 0);
add(new JLabel(new ImageIcon(gems[type][tier].getImage())),gc);
gc.gridx++;
}
gc.gridx = 0;
gc.gridy++;
}
}
编辑编辑:我希望白色面板保持相同大小,并希望 JLabels 本身调整大小(即缩小标签之间的空白)以适应该面板。
注意:如果我没有gc.fill = GridBagConstraints.BOTH; 行,那么白色面板上的图像只占白色面板的一小部分(刚好足以使它们不重叠)。结果,我认为gc.fill = GridBagConstraints.BOTH; 会完美地填满白色面板。
“解决方案”编辑:好吧,我似乎有一个解决方案,尽管一个不稳定的解决方案。我只是将setPreferredSize(new Dimension(1,1)); 附加到白色面板的构造函数中,结果它保持了我想要的大小。如果有人愿意详细说明发生了什么,我将不胜感激:)
【问题讨论】:
-
这就是 GridBagLayout 的工作原理——它尝试使用组件的 preferredSizes 以尽可能最佳的方式和大小来适应它们。考虑 1) 显示相关代码,最好是 sscce,以及 2) 显示您希望下部 gui 在包含所有图像时的样子。
-
"What I am trying to do here is to keep panel 1 (white) the same size as in the first picture when I actually add my images. I do not want the panel to resize and take over some of the other panels."-- 那么当图像占用的大小超过组件显示的大小时,您希望发生什么行为?您希望某些图像不显示吗?请向我们提供尽可能多的信息,以便我们了解问题所在。 -
上面再次编辑,抱歉信息不足。
-
如果有人愿意向我解释发生了什么,请从 EDIT 向下阅读,谢谢。
标签: java swing jpanel layout-manager gridbaglayout