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

arp*_*oid 17 java user-interface swing 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);
Run Code Online (Sandbox Code Playgroud)

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

这是我的标签的样子 在此输入图像描述

Jes*_*own 24

标签中的文字实际上已与顶部对齐.即使你设置了以下所有三个:

label.setVerticalAlignment(JLabel.TOP);
label.setVerticalTextPosition(JLabel.TOP);
panel.setAlignmentY(TOP_ALIGNMENT);
Run Code Online (Sandbox Code Playgroud)

你仍然会发现这个差距.

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

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

label.setBorder(BorderFactory.createEmptyBorder( -3 /*top*/, 0, 0, 0 ));
Run Code Online (Sandbox Code Playgroud)

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


tra*_*god 6

图中的箭头指向字形名义上升最大上升之间的差异,如中所述FontMetrics.你可以修补setBorder(null); 但绝对的控制权,你就必须自己呈现字形,如图所示这里.幸运的是,大多数字体的数字字形具有统一的前进上升.

  • 即使你做`FontMetrics fontMetrics = label.getFontMetrics(font); int offset = fontMetrics.getMaxAscent() - fontMetrics.getAscent(); System.out.println(offset);`使用他的示例代码并将字体设置为Arial,您将获得零差异.这实际上是一个已知的错误(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6623223)可能无法修复,因为它破坏了向后兼容性并标记了如此低的优先级. (3认同)