我注意到在 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));
然后,三个彩色框各只有 100 像素高,并且只占据屏幕的上半部分左右,这也是我所期望的。
但是如果我这样做...
greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));
蓝色面板将另外两个面板压缩到只有几像素高。
这可能不会成为问题,我可以为所有内容设置最大大小,但在假设的情况下这实际上不可行,有没有办法改变这种行为,或者这只是什么盒子布局?
编辑:
好的,所以我们称 test1 为:
greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));
...这对任何东西都没有影响,因为绿色和黄色面板无论如何都大约 200 像素高。
测试2:
greenPanel.setMaximumSize(new Dimension(400,100));
yellowPanel.setMaximumSize(new Dimension(400,100));
...如最初描述的那样,导致蓝色面板排挤绿色和黄色面板。
测试3:
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 像素高的绿色和黄色面板,正如您所描述的,除了在实践中实际发生的情况与测试 2 中的情况完全相同。
最佳答案
问题是,bluePane 的默认最大尺寸现在是 32767x32767...
布局管理器基本上会尝试为蓝色提供最大的空间量(默认的最小尺寸在我的电脑上似乎是 10x10(默认的首选尺寸也是如此))
如果我不使用 setMaximumSize,而是更改您的代码以使用 minimumSize
greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));
我可以获得想要的结果,因为布局管理器无法再为蓝色 Pane 分配更多空间。
更新
那么我错过了一些东西。
如果我使用您的默认代码,我会正常设置所有三个面板。 如果我只使用绿色和黄色(最大尺寸),那么它们会像你描述的那样被压扁 如果我设置绿色和黄色的最小尺寸,我会正常设置三个面板
这是我使用的代码。
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);
}
你的默认值
仅限绿色和黄色最大(蓝色默认尺寸)
仅限绿色和黄色最小尺寸(蓝色默认尺寸)
现在认真考虑一下发生了什么。
在默认测试下,布局管理器已确定它可以按比例布局所有面板(因为高度相同)。它必须这样做,因为已经设置了最大尺寸并且它有足够的空间来这样做。事实上,如果我根本不设置任何尺寸(全部默认),它们就会这样布局
在测试 1 中,确定蓝色 Pane 比绿色和黄色需要更多的空间(蓝色 MAX 高度 = 32767,绿色和黄色 MAX 高度 = 100) ,因此它将它们压扁(绿色和黄色的最小高度为 10 像素)
在测试 2 中,决定蓝色 Pane 应该接收最多的大小(因为它的 MAX 大小是 32767,但最小和优先大小是 10),但它也发现绿色和黄色 Pane 不能小于 100 像素,因此它将剩余空间分配给蓝色(在本例中约为 100 像素)。
更新 2
好的,这就是我的计算结果:P。基本上,仅使用最小值或仅使用最大值之间的区别在于这些尺寸的默认尺寸 (min/max/pref)。
当您仅使用最小值时,总组合最大高度为 98301(每个组件最大为 32767)。这需要在组件之间进行划分。布局使用分解方法(根据需要为所有组件提供一定百分比的空间)。为此,它结合使用了最大尺寸和首选尺寸。
当我只使用最小尺寸时,绿色和黄色实际分配了 200 像素 - 这归结为最大尺寸值。仅使用最大尺寸,绿色和黄色分配了 11 个像素(因为蓝色占据了最大份额)。
...所以是的,最小尺寸被忽略了...在这种情况下。
如果分配的空间量 (600) >= 总首选空间 (30),则布局管理器使用此路径。如果分配的空间 (600) < 总首选空间,布局管理器将使用 pref/min 大小的组合来计算因子...
文档实际上说布局管理器可能会忽略其中一个或多个 (max/min/pref) 值,因为它们只是一条指导线。
但是,如果改为使用 pref 大小,蓝色和绿色将分配 229 个像素(蓝色仅获得 140 个像素)。
在这种情况下,我会选择 max 和 pref 大小的组合,或者使用类似 GridBagLayout 的东西。
我没用过它,但很多人都对 MigLayout 深信不疑。
嘿,谢谢你提出一个有趣的问题 ;)
关于java - setMaximumSize 对以 boxlayout 排列的 JPanel 的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11479012/