好的,关于下面的测试代码的几个问题......我没有完整的工作程序发布,但我希望人们知道Swing足够好,可以用它来刺激它。这是JPanel(BoxLayout)中的JLabel,我正在调整右下角的标签大小。
我所得到的代码如图所示是一个300宽×30高的状态框。我已经摆弄了首选尺寸和标签最小尺寸,并且似乎没有任何理性的行为。
顺便说一句,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;
}
答案 0 :(得分:2)
我可以解释#1和#2:
来自BoxLayout javadocs:“BoxLayout尝试以首选宽度(水平布局)或高度(垂直布局)排列组件。”
换句话说,BoxLayout使用内部组件(在您的情况下,statusLabel)来决定 widths ,但是JPanel本身(在合理范围内)决定高度
你通常可以使用Glue而不是RigidArea来移动东西,但我同意这需要一些时间来适应。
#4是Swing效率太高 - 如果JLabel为空,则文本矩形为0x0。最终在SwingUtilities.layoutCompoundLabelImpl()中确定。
我认为#3是因为BoxLayout试图尊重内部组件的首选大小。因为setMinimumSize可以说是覆盖了他们的首选大小。