首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >setMaximumSize对箱体布局中JPanels的影响

setMaximumSize对箱体布局中JPanels的影响
EN

Stack Overflow用户
提问于 2012-07-13 22:09:04
回答 1查看 5.9K关注 0票数 2

我注意到了在盒子布局中设置最大尺寸的奇怪之处。

我需要一列面板从窗口的右边运行,我尝试用一个盒子布局来设置它。可能有8-10个,或者30-40,所以我给他们足够的空间来解释30-40,但是如果只有8-10,他们分散开来占据所有可用的空间,这看起来很奇怪。所以我想我会让他们阻止这一切发生.

...and,我总是让他们中的大多数消失。

所以我把它分解成一堆非常基本的彩色面板,试着看看是怎么回事,我想出了如何继续,但我不喜欢它。

代码语言:javascript
复制
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();
  }
}

...that让你如愿以偿:三个彩色盒子占据了屏幕的右半部分。

如果我加上这样的内容:

代码语言:javascript
复制
greenPanel.setMaximumSize(new Dimension(400,100));
bluePanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

相反,这三个彩色盒子每个只有100 up高,并且只占据屏幕的上半部分,这也是我所期望的。

但如果我这么做..。

代码语言:javascript
复制
greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

蓝色的面板把另外两个都压缩到只有几个px高。

这可能不会是个问题,我可以为每件事设定一个最大的大小,但是在假设的情况下,这是不可行的,有没有办法改变这种行为,或者这就是盒子布局所做的?

编辑:

好吧,我们叫test1这个:

代码语言:javascript
复制
greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));

...which对任何东西都没有影响,因为绿色和黄色的面板无论如何都是200 px高。

test2:

代码语言:javascript
复制
greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

...causes的蓝色面板,以排挤绿色和黄色的,如最初所描述的。

test3:

代码语言:javascript
复制
greenPanel.setMinimumSize(new Dimension(400,100));
greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));

正如您所描述的,...SHOULD的结果是绿色和黄色面板的高度为100 px,但实际上发生的事情与在test2中发生的情况完全相同。

EN

回答 1

Stack Overflow用户

发布于 2012-07-14 06:31:48

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

布局管理器基本上可以提供最大的空间(默认的最小大小在我的PC上似乎是10x10 (默认的首选大小也是这样))。

如果我没有使用setMaximumSize,而是将您的代码更改为使用minimumSize

代码语言:javascript
复制
greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));

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

更新

那我就少了点什么。

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

这是我用的密码。

代码语言:javascript
复制
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);

  }

你的默认

绿色和黄色上限(蓝色默认尺寸)

仅限绿色和黄色Min (蓝色默认尺寸)

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

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

在测试1中,确定蓝色窗格比绿色和黄色需要更大的空间(蓝色MAX身高= 32767,绿色和黄色最大高度= 100),从而压缩它们(绿色和黄色最小高度为10个像素)。

在测试2中,确定蓝色窗格应该接收最多的大小(因为它的最大大小为32767,但最小和预f大小为10),但也发现绿色和黄色窗格不能小于100个像素,因此它将剩余的空间分配给蓝色(在本例中约为100个像素)。

更新2

好的,下面是我得出的结论:P.基本上,只使用min还是只使用max之间的区别在于这些大小的默认大小(min/max/pref)。

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

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

..。所以是的,最小尺寸被忽略了.在这个案子里。

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

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

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

在这种情况下,我会选择max & pref大小的组合,或者使用类似于GridBagLayout的东西。

我没有用过它,但是很多人对MigLayout发誓。

谢谢你提出一个有趣的问题;)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11479012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档