JLabel垂直对齐无法按预期工作

时间:2011-08-18 22:48:26

标签: java swing user-interface jlabel

Font font = Font("Arial", Font.BOLD, 35);

JLabel label = new JLabel("57");
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
panel.add(label);

这会创建一个JLabel,在其上方和下方有一个额外的空间。我试过了setVerticalAlignment(SwingConstants.TOP)但是没有用。同样,我不想将JLabel与顶部对齐,但JLabel中的文本应该与顶部对齐。

这是我的标签的样子 enter image description here

2 个答案:

答案 0 :(得分:22)

标签中的文字实际上已与顶部对齐。即使你设置了全部三个:

label.setVerticalAlignment(JLabel.TOP);
label.setVerticalTextPosition(JLabel.TOP);
panel.setAlignmentY(TOP_ALIGNMENT);

你仍然会发现这个差距。

问题与font-metrics有关。字体为变音符号留出空间,虽然英文数字甚至字母都不包含大写字母的变音符号,但Arial肯定包含全面的国际字符,包括高于大写字母的字符,例如德语变音符号(ÄÖÜ)或字符含有葡萄牙语变音符号(ÁÂÃ)。

如果您想要一个快速,简单的解决方案,这可能无法在字体和平台上很好地扩展,您可以在边框上使用负值来补偿字体指标。

label.setBorder(BorderFactory.createEmptyBorder( -3 /*top*/, 0, 0, 0 ));

如果你想“正确”修复它,你应该研究一下FontMetrics包的学习,因为它有很多函数可以用来计算显示文本的实际高度和位置,这样你可以用适当的像素数移动整个字符串。

答案 1 :(得分:5)

图中的箭头指向字形标称​​上升最大上升之间的差异,如FontMetrics中所述。你可以修补setBorder(null);但是对于绝对控制,你必须自己渲染字形,如here所示。幸运的是,大多数字体的数字字形都有统一的 advance ascent