当JLabel包含HTML时,BoxLayout不尊重胶水

时间:2017-05-16 04:07:40

标签: java html swing jlabel boxlayout

我有一个我编写的组件,它使用BoxLayout水平布局一些JLabel,然后是胶水(我希望JLabels的宽度保持固定)。例如:

enter image description here

我需要为每个JLabel添加两行文本,所以我使用了一些HTML。一旦我添加了HTML,BoxLayout就停止了对胶水的尊重。我得到类似的东西:

enter image description here

我可以通过指定最大大小应该等于首选大小来解决这个问题(指定首选大小没有效果)。这是正确的方法吗?当我的JLabel中有HTML时,是否有一些解释为什么胶水似乎被忽略了?

MWE:

import javax.swing.*;
import java.awt.*;

public class LabelBreak extends JFrame {

JPanel panel;

public LabelBreak() {
    setTitle("Frame");
    panel = new MyPanel();
    panel.setPreferredSize(new Dimension(500, 100));
    add(panel);
}

public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
        JFrame frame = new LabelBreak();
        frame.pack();
        frame.setVisible(true);
    });
}

private static class MyPanel extends JPanel {
    private MyPanel() {
        super();
        this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
        JPanel header = new JPanel();
        header.setLayout(new BoxLayout(header, BoxLayout.X_AXIS));
        //JLabel label = new JLabel("One");
        JLabel label = new JLabel("<html>One<br>is<br>the<br>loneliest<br>number</html>");
        label.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
        header.add(label);
        label = new JLabel("Two");
        label.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
        header.add(label);
        header.add(Box.createHorizontalGlue());
        this.add(header);
    }
}
}

2 个答案:

答案 0 :(得分:1)

  

当我的JLabel中有HTML时,是否有一些解释为什么胶水似乎被忽略了?

BoxLayout将尊重组件的最大大小(和最小大小)。

对于普通文本,最大大小将是组件的首选大小,因此胶水可以按预期工作。

对于HTML与常规文本,最大大小的计算看起来不同。

  

我可以通过指定最大大小应该等于首选大小

来解决这个问题

是的,这是一种合理的方法,但我会覆盖getMaximumSize()方法,只返回getPreferredSize()值。

@Override
public Dimension getMaximumSize()
{
    return getPreferredSize();
}

这样,如果您更改HTML,它仍然有效。

答案 1 :(得分:0)

BoxLayout尊重JLabel的最大尺寸,因此您必须设置它。

要控制两个标签之间的宽度,您可以使用Box.createHorizontalStrut(width)

请注意,两个标签位于header的中心位置。我会使用GridLayout将组件放在一行中,列之间的空间不同。

private MyPanel() {
            super();
            this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
            JPanel header = new JPanel();
            header.setLayout(new GridLayout(1,4,20,0));
            // JLabel label = new JLabel("One");
            JLabel label = new JLabel("<html>One<br>is<br>the<br>loneliest<br>number</html>");
            label.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
            label.setMaximumSize(label.getPreferredSize());
            header.add(label);
//          header.add(Box.createHorizontalStrut(10));
            label = new JLabel("Two");
            label.setBorder(BorderFactory.createLineBorder(Color.RED, 2));
            header.add(label);
            // header.add(Box.createHorizontalGlue());
            this.add(header);
        }