Java Swing组件交互(BoxLayout和Label)

时间:2012-02-21 18:57:32

标签: java swing jpanel jlabel boxlayout

好的,关于下面的测试代码的几个问题......我没有完整的工作程序发布,但我希望人们知道Swing足够好,可以用它来刺激它。这是JPanel(BoxLayout)中的JLabel,我正在调整右下角的标签大小。

我所得到的代码如图所示是一个300宽×30高的状态框。我已经摆弄了首选尺寸和标签最小尺寸,并且似乎没有任何理性的行为。

  1. 为什么JPanel首选尺寸会影响身高但不会影响身高 宽度?如果我将setPreferredSize()中的x维度更改为0或 500,它仍然从标签出来300。
  2. 为什么JLabel最小尺寸会影响宽度而不会影响宽度 高度?如果我评论setPreferredSize()调用并增加 标签高度为30,没有任何反应。
  3. 我开始使用JPanel setMinimumSize(已评论),但它不再有任何内容 效果 - 为什么JPanel需要setPreferredSize()?
  4. 如果我将标签文字从“”更改为“”,则会增加高度 标签。由于标签不在这里控制高度, 为什么这会产生任何影响?
  5. 顺便说一句,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 个答案:

答案 0 :(得分:2)

我可以解释#1和#2:

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

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

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

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

我认为#3是因为BoxLayout试图尊重内部组件的首选大小。因为setMinimumSize可以说是覆盖了他们的首选大小。