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

时间:2012-11-04 13:57:05

标签: java html swing rendering jlabel

我想理解为什么呈现HTML的JLabel会移动它的输出文本的垂直位置,而呈现非HTML的JLabel则不会。

  • 使用的Java版本:1.6.0_37
  • 使用Swing Look and Feel :Windows(“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”)
  • 操作系统:Windows 7 64位

我没有把SSCCE放在一起,因为代码非常简单。但如果有帮助,请说出来。

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

Example of JLabel, rendering plain text and HTML

我将一个JPanel作为JLabel周围的容器来显示标签的边界。设置JLabel的字体和文本后,

jLabel.getPreferredSize()

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

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

一种解决方法是翻译要渲染文本的Graphics2D,以补偿垂直移位,如下所示:

g2d.translate( 0, -20 );

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

非常感谢您的回答,非常感谢!

1 个答案:

答案 0 :(得分:2)

如果我们使用Font为HTML JLabel设置setFont(..)(系列,大小等),则字体不会呈现为JLabel的正确指标

以下是我演示的示例(显示的JLabel都使用HTML):

enter image description here

一个简单的解决方法是HTML中的字体大小,族等。

我们可以看到青色 HTML JLabel使用setFont(..)(并且错误地呈现),而绿色 HTML JLabel使用HTML来设置字体并正确呈现:

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

<强> Test.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);

    }
}