我有一个我编写的组件,它使用BoxLayout水平布局一些JLabel,然后是胶水(我希望JLabels的宽度保持固定)。例如:
我需要为每个JLabel添加两行文本,所以我使用了一些HTML。一旦我添加了HTML,BoxLayout就停止了对胶水的尊重。我得到类似的东西:
我可以通过指定最大大小应该等于首选大小来解决这个问题(指定首选大小没有效果)。这是正确的方法吗?当我的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);
}
}
}
答案 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);
}