3

我想了解为什么呈现 HTML 的 JLabel 会改变其输出文本的垂直位置,而呈现非 HTML 的 JLabel 不会。

  • 使用的 Java 版本:1.6.0_37
  • 使用的 Swing 外观:Windows ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel")
  • 操作系统:Windows 7 64 位

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

我宁愿使用显示行为的图像来举例说明:

JLabel 示例,呈现纯文本和 HTML

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

jLabel.getPreferredSize()

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

我想知道为什么会发生这种情况以及我可以做些什么来纠正这个位置。

一种解决方法是转换要在其上呈现文本的 Graphics2D,以补偿垂直偏移,如下所示:

g2d.translate( 0, -20 );

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

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

4

1 回答 1

2

似乎如果我们使用字体为FontHTML 设置(family,size 等),则不会呈现为正确的.JLabelsetFont(..)JLabel

这是我演示的示例(JLabel显示的两个都使用 HTML):

在此处输入图像描述

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

我们可以看到青色的HTMLJLabel使用setFont(..)(并且被错误地渲染),而绿色的HTMLJLabel使用 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);

    }
}
于 2012-11-04T15:21:22.013 回答