如何使用自定义字体对我的JLabel文本进行抗锯齿处理?

时间:2011-08-23 13:04:06

标签: java swing fonts antialiasing

我正在尝试使用Java 1.6创建SWING应用程序,并且我有一个使用.ttf文件中的自定义字体的JLabel。

我认为默认情况下1.6有抗锯齿功能,但我的文字非常像素化。

这是一个代码示例和显示结果的图像:

package aceprobowler.test;

import java.awt.Color;
import java.awt.Font;
import java.io.InputStream;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

import aceprobowler.options.OptionsValues;

public class TestAntialiasedText extends JFrame
{
    private static final long serialVersionUID = 2411330284507353990L;

    public TestAntialiasedText(String title)
    {
        super(title);
        setSize(800,200);

        Font titleFont = null;

        try
        {
            InputStream is = OptionsValues.class.getResourceAsStream("fonts//KOMIKAX_.ttf");
            titleFont = Font.createFont(Font.TRUETYPE_FONT, is).deriveFont(Font.PLAIN, 60);
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
            System.err.println("font not loaded.  Using serif font.");
            titleFont = new Font("serif", Font.PLAIN, 24);
        }

        JPanel panelWithText = new JPanel();
        JLabel labelWithText = new JLabel("This is a test");

        labelWithText.setFont(titleFont);

        labelWithText.setBackground(Color.BLACK);
        labelWithText.setForeground(Color.WHITE);
        labelWithText.setOpaque(true);

        panelWithText.add(labelWithText);
        add(panelWithText);
    }

    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new TestAntialiasedText("Testing text anti-alias").setVisible(true);
            }
        });
    }
}

在“T”和“A”上最为明显 Not anti-aliased text

我尝试创建一个重写paintComponent(Graphics g)并使用

的内部类
Graphics2D g2 = (Graphics2D)g; 
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)

但它不起作用。任何人都可以帮我解决这个问题吗?我无法在互联网上找到关于此的任何信息,因为Javaj 1.6应该使SWING相关的所有内容在默认情况下消除锯齿。

提前致谢!

3 个答案:

答案 0 :(得分:3)

当您覆盖paintComponent实例的JLabel方法时,我认为您需要使用以下内容:

有关示例,请参阅:

答案 1 :(得分:3)

我认为字体抗锯齿的默认值因平台而异。你没有说你在哪个平台上。在任何情况下,设置文本抗锯齿渲染提示都应该修复它。

答案 2 :(得分:3)

另一种方法是使用TextLayout并提供isAntiAliased {{1}},如FontRenderContext所示。