好的,关于下面的测试代码的几个问题...我没有完整的工作程序可以发布,但我希望人们足够了解 Swing 来尝试一下。这是 JPanel(BoxLayout) 内部的 JLabel,我正在调整右下角标签的大小。
我使用如图所示的代码得到的是一个 300 宽 x 30 高的状态框。我摆弄了首选尺寸和标签最小尺寸,它似乎没有以任何合理的方式表现。
- 为什么 JPanel Preferred Size 影响高度而不影响高度 宽度?如果我将 setPreferredSize() 中的 x 尺寸更改为 0 或 500,标签上的数字仍然是 300。
- 为什么 JLabel 最小尺寸影响宽度而不影响宽度 高度?如果我评论 setPreferredSize() 调用并增加 标签高度设置为 30,没有任何反应。
- 我开始使用 JPanel setMinimumSize (已注释),但它不再有任何 效果 - 为什么 JPanel 需要 setPreferredSize()?
- 如果我将标签文本从“”更改为“”,则会增加高度 标签的。由于此处标签不控制高度, 为什么这会产生任何影响?
顺便说一下,createRigidArea() 调用是强制分隔符位于右侧,而不是固定在屏幕的左侧。如果有任何不那么笨拙的想法,我将不胜感激。
private JComponent makeStatusBarTest() {
JPanel statusPanel = new JPanel();
statusPanel.setLayout(new BoxLayout(statusPanel, BoxLayout.LINE_AXIS));
statusPanel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
// statusPanel.setMinimumSize(new Dimension(0, 30));
statusPanel.setPreferredSize(new Dimension(500, 30));
JLabel statusLabel = new JLabel();
Border emptyBorder = BorderFactory.createEmptyBorder(5, 10, 5, 10);
statusLabel.setBorder(emptyBorder);
statusLabel.setText("");
statusLabel.setMinimumSize(new Dimension(300, 20));
statusPanel.add(statusLabel);
statusPanel.add(new JSeparator(SwingConstants.VERTICAL));
statusPanel.add(Box.createRigidArea(new Dimension(5000,0)));
return statusPanel;
}
最佳答案
我可以解释#1 和#2:
摘自 BoxLayout javadocs:“BoxLayout 尝试按照组件的首选宽度(对于水平布局)或高度(对于垂直布局)来排列组件。”
换句话说,BoxLayout 使用内部组件(在您的例子中为 statusLabel)来决定宽度,但 JPanel 本身(在合理范围内)来决定高度 .
您通常可以使用 Glue 而不是 RigidArea 来移动东西,但我同意这需要一些时间来适应。
#4 Swing 效率太高 - 如果 JLabel 为空,则文本矩形为 0x0。最终在SwingUtilities.layoutCompoundLabelImpl()中确定。
我认为#3 是因为 BoxLayout 试图尊重内部组件的首选大小。因为 setMinimumSize 可以说会覆盖它们的首选大小。
关于Java Swing 组件交互(BoxLayout 和 Label),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383444/