Java 如何制作我的JLabel';s文本,使用自定义字体,抗锯齿?

Java 如何制作我的JLabel';s文本,使用自定义字体,抗锯齿?,java,swing,fonts,antialiasing,Java,Swing,Fonts,Antialiasing,我正在尝试使用Java1.6创建一个SWING应用程序,我有一个JLabel,它使用.ttf文件中的自定义字体 我原以为1.6默认启用了抗锯齿功能,但我的文本是非常像素化的 以下是代码示例和显示结果的图像: package aceprobowler.test; import java.awt.Color; import java.awt.Font; import java.io.InputStream; import javax.swing.JFrame; import javax.swin

我正在尝试使用Java1.6创建一个SWING应用程序,我有一个JLabel,它使用.ttf文件中的自定义字体

我原以为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)
但它不起作用。有人能帮我解决这个问题吗?我在互联网上找不到任何关于这方面的信息,因为JavaJ1.6应该在默认情况下使所有与SWING相关的内容都具有抗锯齿功能


提前谢谢

当您重写
JLabel
实例的
paintComponent
方法时,我相信您需要使用以下方法:

有关示例,请参见:


我认为字体抗锯齿的默认设置因平台而异。你不能说你在哪个站台上。在任何情况下,设置文本抗锯齿渲染提示都应该可以解决此问题。

另一种方法是使用并提供一个
Isatariasied
,如图所示。

我使用的是Windows Vista。但是,使用文本反序列化设置设置渲染提示不起作用。这只是个问题,因为这个主题不是我喜欢的Java主题,使用
setFont(myFont)
(对于纯文本)使用
myLabel.setText(someString)
,或者在特殊情况下
myLabel.setText(htmlformatter)是不可能的
+1我不得不同意:简单可能更好,尽管我喜欢
TextLayout
当我需要最好的指标时,例如复合控件。@Adam Smith,Odd。我自己还没有测试过。我假设您的实现非常类似于我链接您的
RichJLabel
示例?很抱歉上次的评论,我在paintComponent方法中键入了错误的内容,它现在可以工作了!这比在构造函数中键入文本要复杂一些,但至少它可以工作。。。非常感谢,我真的很感谢你的帮助!不过,有一个问题:既然x,y坐标是最左边字母的基线,那么有没有一种方法可以轻松计算出这些坐标,从而使文本显示在相同的位置,就像我没有覆盖paintComponent时一样?@Adam Smith。没问题。好问题。这是我必须再考虑的事情。现在很忙!谢谢你的提问和回复D