我将JFrame的内容窗格设置为我创建的面板。该面板使用Grid Bag Layout
作为后续面板。我这样设置了这样的布局:
private void initPanel() {
setLayout(new GridBagLayout());
constraints = new GridBagConstraints();
populateGUI();
}
这会使“游戏”像这样:
我实际上要做的是将这些面板(小方块)展开。 JFrame的尺寸为800 x 500,因此每个面板应占用100 x 100,总共40个面板。问题是面板太小了。
我使用以下代码填充JFrame的内容窗格(由自己的面板替换 - 用红色标记):
private void populateGUI() {
// Fill the frame with panels
for (int rowPos = 0; rowPos < numColumns; rowPos++) {
for (int colPos = 0; colPos < numRows; colPos++) {
constraints.gridx = rowPos;
constraints.gridy = colPos;
// Add component
add(new GameDummyPanel(gameUtil.generateRandomColour(),
panelWidth, panelHeight), constraints);
}
}
}
注意 - 这些是我实施的唯一约束。在GameDummyPanel类中,我使用以下内容设置大小:
public GameDummyPanel( Color panelColor, int panelWidth, int panelHeight )
{
dummyPanelWidth = panelWidth / 8;
dummyPanelHeight = panelHeight / 5;
setBackground( panelColor );
setSize( new Dimension( dummyPanelWidth, dummyPanelHeight ) );
}
那为什么不执行这个呢?它不像我在面板和作为JFrame的内容窗格的面板上调用pack。
由于
更新
检查并实现了需要完成的答案 - 如果您不想在下面阅读 - 是将约束的fill
属性设置为BOTH
并从中删除所有基于大小的属性小组课。这意味着我的约束看起来像这样:
constraints = new GridBagConstraints();
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.fill = GridBagConstraints.BOTH;
减去设置gridx
和gridy
的每个面板的实际唯一定位。然后,实际上可以完成JPanel实现,并且即时创建JPanel。
答案 0 :(得分:2)
将以下值设置为面板:
constraints.weightx = 1.0;
constraints.weighty = 1.0;
来自http://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
除非您为weightx或weighty指定至少一个非零值,否则所有组件在其容器的中心聚集在一起。这是因为当权重为0.0(默认值)时,GridBagLayout会在其单元格网格和容器边缘之间放置任何额外的空格。
此外,您不应手动设置面板的大小,让GridBagLayout完成其工作,只需根据您的喜好配置约束,对于最简单的布局,您至少应考虑以下变量:
gridx, gridy
fill
anchor
weightx, weighty
所有这些都在上一个链接中解释过。
答案 1 :(得分:2)
尝试使用GridBagConstraints
的更多属性。
constraints.weightx=1.0;
constraints.weighty=1.0;
constraints.fill=GridBagConstraints.BOTH;
OR
在这种情况下,请使用GridLayout
代替GridBagLayout
。
private void initPanel() {
setLayout(new GridLayout(numRows, numColumns));
populateGUI();
}
答案 2 :(得分:1)
不要在面板上拨打setSize()
。
执行覆盖面板的getPreferredSize()
。 GridBagLayout
尊重首选尺寸。如果你没有覆盖,它会影响你的体验。
@Override
public Dimension getPreferredSize() {
return new Dimension(SIZE, SIZE);
}
执行致电frame.pack()
,以便preferredSize
得到尊重(不要设置框架尺寸)
执行,请参阅Should I avoid the use of set(Preferred|Maximum|Minimum)Size methods in Java Swing?