【问题标题】:How can I make my JLabel's text, using a custom font, antialiased?如何使我的 JLabel 的文本,使用自定义字体,抗锯齿?
【发布时间】:2011-08-23 13:04:05
【问题描述】:

我正在尝试使用 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”上最明显

我尝试创建一个覆盖 paintComponent(Graphics g) 的内部类并使用

Graphics2D g2 = (Graphics2D)g; 
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)

但它不起作用。谁能帮我解决这个问题?我在互联网上找不到任何关于此的信息,因为 Javaj 1.6 应该默认将所有与 SWING 相关的东西都设为抗锯齿。

提前致谢!

【问题讨论】:

    标签: java swing fonts antialiasing


    【解决方案1】:

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

    例如,请参阅:

    【讨论】:

    • @Adam Smith,奇数。我自己没有测试过这个。我假设您的实现与我链接的RichJLabel 示例非常相似?
    • 抱歉上次的评论,我在 paintComponent 方法中输入了错误,现在可以使用了!它比在构造函数中输入文本要复杂一些,但至少它可以工作......非常感谢,非常感谢您的帮助!只是一个问题:由于 x,y 坐标是最左边字母的基线,有没有一种方法可以轻松计算这些坐标,以使文本出现在与我没有覆盖通常情况下相同的位置油漆组件?
    • @亚当·史密斯。没问题。好问题。这是我必须考虑更多的事情。目前很忙!感谢您的提问和回复。 :D
    【解决方案2】:

    我相信字体抗锯齿的默认设置因平台而异。你不说你在哪个平台上。无论如何,设置文本抗锯齿渲染提示应该可以解决它。

    【讨论】:

    • 我使用的是 Windows Vista。但是,使用文本抗锯齿设置设置渲染提示不起作用。
    【解决方案3】:

    另一种方法是使用TextLayout 并提供FontRenderContextisAntiAliased,如图所示here

    【讨论】:

    • 只是一个问题,因为这个主题不是我的 Java 杯,使用 setFont(myFont)(对于纯文本)使用 myLabel.setText(someString) 或在特殊情况下使用 @987654329 是不可能/最安全的@+1
    • 我不得不同意:更简单可能更好,虽然我喜欢TextLayout,当我需要最好的指标时,例如复合控件。
    猜你喜欢
    • 2014-03-19
    • 2013-04-19
    • 2019-07-10
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多