使用面板填充内容窗格

时间:2014-05-07 16:20:57

标签: java swing jpanel gridbaglayout preferredsize

我将JFrame的内容窗格设置为我创建的面板。该面板使用Grid Bag Layout作为后续面板。我这样设置了这样的布局:

private void initPanel() {

    setLayout(new GridBagLayout());
    constraints = new GridBagConstraints();
    populateGUI();
}

这会使“游戏”像这样:

enter image description here

我实际上要做的是将这些面板(小方块)展开。 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;

减去设置gridxgridy的每个面板的实际唯一定位。然后,实际上可以完成JPanel实现,并且即时创建JPanel。

3 个答案:

答案 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();
}

enter image description here

答案 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?