JLabel 在显示 HTML 时垂直向下移动文本

2024-01-06

我想了解为什么渲染 HTML 的 JLabel 会移动其输出文本的垂直位置,而渲染非 HTML 的 JLabel 则不会。

  • 使用的Java版本:1.6.0_37
  • 使用 Swing 的外观和感觉:Windows(“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”)
  • OS:Windows 7 64 位

我没有将 SSCCE 放在一起,因为代码确实很简单。但如果有帮助请说出来。

我宁愿用显示行为的图像给出一个例子:

我将 JPanel 作为 JLabel 周围的容器来可视化标签的边界。设置 JLabel 的字体和文本后,

jLabel.getPreferredSize()

方法返回呈现的纯文本或 HTML 的边界(这是我为周围的 JPanel 设置的确切大小)。您可以清楚地看到,如果渲染 HTML,整个文本会向下移动少量。

我想知道为什么会发生这种情况以及我可以采取哪些措施来纠正该位置。

一种解决方法是平移用于渲染文本的 Graphics2D,以补偿垂直偏移,如下所示:

g2d.translate( 0, -20 );

但我不知道与字体指标(例如字体大小)相关的正确 y 值。无论如何,这种解决方法也让人感觉“错误”。

我真的很感谢您的回答,非常感谢!


看来如果我们设置Font(系列、尺寸等)用于 HTMLJLabel using setFont(..)字体未呈现为正确的规格JLabel.

这是我用来演示的一个例子(两者JLabel显示的是使用 HTML):

一个简单的解决方法是调整 HTML 中的字体大小、系列等。

正如我们所看到的cyan HTML JLabel used setFont(..)(并且被错误地渲染)而green HTML JLabel使用 HTML 设置字体并正确呈现:

JLabel labelHtml2 = new JLabel("<html><font size=10 family='Calibri'>" + text + "</font></html>");

测试.java:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static Font font = new Font("Calibri", Font.PLAIN, 38);

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();

                }
                new Test();
            }
        });
    }

    private void initComponents() {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String text = "Hello world";

        //this label will not render correctly due to setting font via setFont(..)
        JLabel labelHtml1 = new JLabel("<html>" + text + "</html>");
        labelHtml1.setBackground(Color.CYAN);
        labelHtml1.setOpaque(true);//so background will be painted
        labelHtml1.setFont(font);

        //this label will render correcty font is set via html
        JLabel labelHtml2 = new JLabel("<html><font size=10 family='Calibri'>" + text + "</font></html>");
        labelHtml2.setBackground(Color.GREEN);
        labelHtml2.setOpaque(true);
        //labelHtml2.setFont(font);

        frame.add(labelHtml1, BorderLayout.NORTH);
        frame.add(labelHtml2, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JLabel 在显示 HTML 时垂直向下移动文本 的相关文章

随机推荐