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包,因为它有许多函数可以用来计算显示文本的实际高度和位置,这样你就可以移动整个字符串了.适当的像素数量.
图中的箭头指向字形名义上升和最大上升之间的差异,如中所述FontMetrics.你可以修补setBorder(null); 但绝对的控制权,你就必须自己呈现字形,如图所示这里.幸运的是,大多数字体的数字字形具有统一的前进和上升.