【发布时间】:2012-07-13 22:09:04
【问题描述】:
我注意到在 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));
蓝色面板将另外两个压扁到只有几个 px 高。
这可能不会成为问题,我可以为所有内容设置一个最大大小,但是在这并不可行的假设情况下,有没有办法改变这种行为,或者这只是盒子布局有什么作用?
编辑:
好的,所以我们将 test1 称为:
greenPanel.setMinimumSize(new Dimension(400,100));
yellowPanel.setMinimumSize(new Dimension(400,100));
...这对任何东西都没有影响,因为绿色和黄色面板无论如何都大约 200 px 高。
测试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 px 高的绿色和黄色面板,正如您所描述的,但实际上实际发生的情况与 test2 中的完全相同。
【问题讨论】:
-
永远不要硬编码大小。永远不要考虑空布局或干扰组件的大小提示 (stackoverflow.com/questions/7229226/…)。选择一个满足您的需求并允许微调的 LayoutManager,f.i. MigLayout(或者如果你被核心管理器卡住了,GridBagLayout)。
-
是的,是的,Java 俱乐部的第一条规则。除了布局管理器实际上不会使视觉内容很好地缩放,除非我采取额外措施使其无论如何都可以与空布局一起使用。我对编程约定的宗教态度不感兴趣。
-
耸耸肩,现在是你的时间浪费在坚持做错误的事情上......
标签: java swing layout jpanel sizing