【发布时间】:2014-06-24 17:54:53
【问题描述】:
我将 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 ) );
}
那么为什么不强制执行呢?它不像我在面板上调用 pack 和在充当 JFrame 的内容窗格的面板上。
谢谢
更新
检查并实施了答案之后需要做的事情——如果您不想在下面阅读——将约束的fill 属性设置为BOTH 并从面板类中删除所有基于大小的属性。这意味着我的约束看起来像这样:
constraints = new GridBagConstraints();
constraints.weightx = 1.0;
constraints.weighty = 1.0;
constraints.fill = GridBagConstraints.BOTH;
减去设置gridx 和gridy 的每个面板的实际唯一定位。然后实际上可以取消 JPanel 实现并让 JPanel 即时创建。
【问题讨论】:
-
这篇文章可能会有所帮助:stackoverflow.com/questions/1783793/…
标签: java swing jpanel gridbaglayout preferredsize