setMaximumSize对排列在boxlayout中的JPanel的影响

时间:2012-07-13 22:09:05

标签: java swing layout jpanel sizing

我注意到在boxlayout中设置最大尺寸时会感到奇怪。

我需要在窗口右侧运行一列面板,我尝试使用框布局进行设置。可能有8-10或者可能有30-40,所以我给他们足够的空间来占30-40,但如果只有8-10他们分散占用所有可用空间,它看起来很奇怪。所以我想我会为他们设置MaximumSize以阻止这种情况发生......

......我一直在最后消失。

所以我将它分解成一堆非常基本的彩色面板,试图看看发生了什么,我已经想出如何继续,但我不喜欢它。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class BoxLayoutDemo extends JFrame {


  public BoxLayoutDemo() {
    super("JScrollPane Demonstration");
    setSize(800, 600);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    init();
    setVisible(true);
  }

  public void init() {
    setLayout(null);

    JPanel rightPanel = new JPanel();
    rightPanel.setBounds(400,0,400,600);
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS));

    JPanel greenPanel = new JPanel();
    JPanel bluePanel = new JPanel();
    JPanel yellowPanel = new JPanel();
    greenPanel.setBackground(Color.GREEN);
    bluePanel.setBackground(Color.BLUE);
    yellowPanel.setBackground(Color.YELLOW);

    rightPanel.add(greenPanel);
    rightPanel.add(bluePanel);
    rightPanel.add(yellowPanel);

    add(rightPanel);



  }

  public static void main(String args[]) {
    new BoxLayoutDemo();
  }
}

......这就是我所期待的:三个彩色的盒子占据了屏幕的右半部分。

如果我添加如下内容:

greenPanel.setMaximumSize(new Dimension(400,100));
bluePanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

然后三个彩色的盒子每个只有100px高,只占据屏幕的上半部分,这也是我所期待的。

但如果我这样做......

greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

蓝色面板将其他两个面板压缩到仅几个px高。

这可能不会成为一个问题,我可以设置一切的最大尺寸,但在假设的情况下,这是不可行的,有没有办法改变这种行为,或者这只是什么箱子布局呢?

编辑:

好的,我们将调用test1:

greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));

......这对任何事都没有影响,因为无论如何绿色和黄色面板的高度大约是200像素。

TEST2:

greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

...导致蓝色面板挤出原始描述的绿色和黄色面板。

TEST3:

greenPanel.setMinimumSize(new Dimension(400,100));
greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

...应该如你所描述的那样产生100 px高的绿色和黄色面板,除了在实践中实际发生的事情与test2完全相同。

1 个答案:

答案 0 :(得分:1)

问题是,bluePane的默认最大大小现在是32767x32767 ...

布局管理器基本上会尝试提供最大的蓝色空间(我的PC上的默认最小大小似乎是10x10(默认首选大小也是如此))

如果不使用setMaximumSize,我会更改您的代码以使用minimumSize

greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));

我可以获得所需的结果,因为布局管理器无法再为蓝色窗格分配更多空间。

<强>更新

然后我错过了什么。

如果我使用您的默认代码,我会正常设置所有三个面板。 如果我只使用绿色&amp;黄色(最大尺寸),然后它们会像你描述的那样被压扁 如果我设置绿色&amp;黄色最小尺寸,我得到正常设置的三个面板

这是我正在使用的代码。

public void init() {

    setLayout(null);

    JPanel rightPanel = new JPanel();
    rightPanel.setBounds(400,0,400,600);
    rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.PAGE_AXIS));

    JPanel greenPanel = new JPanel();
    JPanel bluePanel = new JPanel();
    JPanel yellowPanel = new JPanel();

      Dimension size = new Dimension(400, 100);

      // Default
    //    greenPanel.setMaximumSize(size);
    //    bluePanel.setMaximumSize(size);
    //    yellowPanel.setMaximumSize(size);

      // Test 1
    //    greenPanel.setMaximumSize(size);
    //    yellowPanel.setMaximumSize(size);

      // Test 2
      greenPanel.setMinimumSize(size);
      yellowPanel.setMinimumSize(size);

    greenPanel.setBackground(Color.GREEN);
    bluePanel.setBackground(Color.BLUE);
    yellowPanel.setBackground(Color.YELLOW);

    rightPanel.add(greenPanel);
    rightPanel.add(bluePanel);
    rightPanel.add(yellowPanel);

    add(rightPanel);

  }

您的默认

Your default setup

绿色&amp;仅黄色最大值(蓝色默认大小)

Test 1 - Green & Yellow Max only

绿色&amp;仅黄色最小(蓝色默认大小)

Test 2 - Green & Yellow Min only

现在认真考虑一下发生了什么。

在默认测试下,布局管理器已确定它可以按比例布局所有面板(因为高度相同)。它必须这样做,因为已经设置了最大尺寸。它有空间这样做。事实上,如果我根本没有设置任何尺寸(默认值都是这样),它们会以这种方式布局

在测试1下,确定蓝色窗格需要比例更多的空间,然后是绿色和黄色(蓝色 MAX 高度= 32767,绿色和黄色 MAX 高度= 100 ),因此它将它们剔除(绿色和黄色的最小高度为10个像素)

在测试2下,确定蓝色窗格应该获得最大的大小(因为它的 MAX 大小是32767,但是min和pref大小是10),但它也发现绿色和黄色窗格不能小于100像素,因此它将剩余空间分配为蓝色(在这种情况下约为100像素)。

更新2

好的,这就是我的成果:P。基本上,仅使用最小值或仅使用最大值之间的差异将降至这些尺寸的默认大小(min / max / pref)。

当您仅使用min时,总组合最大高度为98301(每个组件最大值为32767)。这需要在组件之间进行划分。布局使用分解方法(根据需要为所有组件提供%的空间)。为此,它使用max和pref大小的组合。

当我只使用最小尺寸时,实际分配了200像素的绿色和黄色 - 这降低到最大尺寸值。仅使用最大尺寸,绿色和黄色分配11个像素(因为蓝色得到了狮子的份额)。

...是的,在这种情况下,最小尺寸被忽略了......

如果分配的空间量(600)>> =总首选空间(30),则布局管理器使用此路径。如果分配的空间(600)是&lt;在总首选空间中,布局管理器将使用pref / min大小的组合来计算分解...

文档实际上说布局管理器可能会忽略其中一个或多个(max / min / pref)值,因为它们只是一个指导线。

但是,如果使用pref大小,蓝色和绿色分配229像素(蓝色只有140)。

在这种情况下,我会选择max&amp; amp; pref size或使用类似GridBagLayout的东西。

我没有使用它,但很多人都对MigLayout发誓。

Hay,感谢一个有趣的问题;)