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中的文本应该与顶部对齐。
这是我的标签的样子
答案 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 。