java - JLabel 垂直对齐不按预期工作

标签 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

最佳答案

标签中的文本实际上已经与顶部对齐。即使您设置了所有三个:

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

你仍然会发现那个差距。

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

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

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

如果您想“正确”修复它,您应该学习了解 FontMetrics包,因为它有许多函数可用于计算所显示文本的实际高度和位置,这样您就可以将整个字符串移动适当的像素量。

关于java - JLabel 垂直对齐不按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7115065/

相关文章:

java - ListPreference标记导致我的应用崩溃

java - 在组合框中复制文本 Java

android - 如何激活全屏控制DOTS(SDK14)

android - android中从右到左的布局

java - setBounds 宽度值将宽度设置为最小值?

java - 如何在 Android 中将数字转换为指数表示法?

java - 当项目在服务器/客户端/共享中拆分时,使用 eclipse 中的 superdevmode

java - Hibernate:在项目范围内定义类型映射

java - 设置drawString,使(0,0)位于绘图区域内

java - 如何使嵌套的 JScrollPanes 正常工作?