【问题标题】:JLabel vertical alignment not working as expectedJLabel 垂直对齐未按预期工作
【发布时间】:2011-08-18 22:48:25
【问题描述】:
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 中的文本应与顶部对齐。

这是我的标签的样子

【问题讨论】:

  • 忘记了一行。 label.setFont(字体);
  • 可能的原因是某些符号会比数字进一步向上延伸,并且标签内的文本对齐方式以及标签的大小必须考虑多个字体指标。 upload.wikimedia.org/wikipedia/commons/3/39/… 不是您问题的答案,但它可能会有所帮助。
  • +1 用于包含图片;顺便说一句,不要忽视 RenderingHints 的价值。

标签: java swing user-interface jlabel


【解决方案1】:

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

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

你仍然会发现那个差距。

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

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

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

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

【讨论】:

  • +1 你能评论一下这个变通方法的相对安全性吗?
  • +1,不错的技巧。我不知道您可以使用负值。 :D
  • 我认为没有什么特别有害的事情需要担心,风险主要是它不是很健壮,如果实际更改字体或渲染不同的字体,可能会抵消不正确的数量不同平台上的像素数等。
【解决方案2】:

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

【讨论】:

  • 即使你在FontMetrics fontMetrics = label.getFontMetrics(font); int offset = fontMetrics.getMaxAscent() - fontMetrics.getAscent(); System.out.println(offset); 使用他的示例代码并将字体设置为Arial,你也会得到零差异。这实际上是一个已知的错误 (bugs.sun.com/bugdatabase/view_bug.do?bug_id=6623223),它可能不会得到修复,因为它破坏了向后兼容性并且被标记为如此低的优先级。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2019-12-25
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多