Java Swing组件交互(BoxLayout和Label)



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

我从代码中得到的是一个300宽乘30高的状态框。我篡改了首选尺寸和标签最小尺寸,它似乎没有以任何合理的方式表现出来。

  1. 为什么JPanel Preferred Size会影响身高而不会影响宽度如果我将setPreferredSize()中的x维度更改为0或500,它仍然从标签中出来300
  2. 为什么JLabel最小尺寸会影响宽度而不会影响身高如果我对setPreferredSize()调用进行注释,并增加标签高度为30,什么也没发生
  3. 我开始使用JPanel setMinimumSize(评论),但它不再有effect-为什么JPanel需要setPreferredSize()
  4. 如果将标签文本从"更改为",则会增加高度标签的。由于这里标签不控制高度,为什么这会有任何影响

顺便说一句,createRigidRea()调用是强制分隔符向右,而不是粘在屏幕的左手边。如果对此有任何不那么草率的想法,我将不胜感激。

    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.layout CompoundLabelImpl().中确定

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

相关内容

  • 没有找到相关文章

最新更新