1

好的,关于下面的测试代码的几个问题......我没有完整的工作程序要发布,但我希望人们对 Swing 有足够的了解,可以尝试一下。这是 JPanel(BoxLayout) 内的 JLabel,我正在调整右下角标签的大小。

如图所示,我得到的是一个 300 宽 x 30 高的状态框。我已经摆弄了首选尺寸和标签最小尺寸,它似乎并没有以任何合理的方式表现。

  1. 为什么 JPanel 首选大小会影响高度而不影响宽度?如果我将 setPreferredSize() 中的 x 维度更改为 0 或 500,它仍然会从标签中显示 300。
  2. 为什么 JLabel 最小尺寸会影响宽度而不影响高度?如果我注释 setPreferredSize() 调用并将标签高度增加到 30,则没有任何反应。
  3. 我开始使用 JPanel setMinimumSize(已注释),但它不再有任何效果 - 为什么 JPanel 需要 setPreferredSize()?
  4. 如果我将标签文本从“”更改为“”,这会增加标签的高度。既然标签在这里没有控制高度,为什么这有任何影响呢?

顺便说一句,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;
}
4

1 回答 1

2

我可以解释#1和#2:

来自 BoxLayout javadocs:“BoxLayout 尝试以首选宽度(用于水平布局)或高度(用于垂直布局)排列组件。”

换句话说, BoxLayout 使用内部组件(在您的情况下为 statusLabel)来决定 widths 但 JPanel 本身(在合理范围内)决定heights

您通常可以使用 Glue 而不是 RigidArea 来移动东西,但我同意这需要一些时间来适应。

#4 Swing 效率太高 - 如果 JLabel 为空,则文本矩形为 0x0。最终在 SwingUtilities.layoutCompoundLabelImpl() 中确定。

我认为#3 是因为 BoxLayout 试图尊重内部组件的首选大小。由于 setMinimumSize 可以说会覆盖它们的首选尺寸。

于 2012-02-21T19:26:43.820 回答