如何在Swing中使单个JComponent渲染别名文本?

时间:2014-08-21 23:23:31

标签: java swing jlabel paintcomponent antialiasing

相关答案,但不适用于OpenJDK 7:https://stackoverflow.com/a/2266260/1648987SwingUtilities2类移动并更改了其API。)

我想显示几个标签,我希望它们可以在使用抗锯齿渲染之间进行切换。我这样做是为了比较,看看如何使用和不使用抗锯齿渲染字体。现在,我试图通过继承JLabel来实现这一目标。这就是我所拥有的:

import java.awt.*;
import javax.swing.JLabel;

public class AALabel extends JLabel {
    /* skipped boring stuff */

    public boolean antialiased;

    public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        if (antialiased) {
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
              RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            g2.setRenderingHint(RenderingHints.KEY_RENDERING,
              RenderingHints.VALUE_RENDER_QUALITY);
        } else {
            g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
              RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
            g2.setRenderingHint(RenderingHints.KEY_RENDERING,
              RenderingHints.VALUE_RENDER_SPEED);
        }
        super.paintComponent(g2);
    }
}

但它什么都没做。无论如何,标签都是抗锯齿的。

我在Linux上使用OpenJDK7,但我希望它也适用于Java 8。

我还考虑转换为手动绘制的JPanel(你知道,@Override public void paint(Graphics g),这种东西)。如果我这样做,我怎样才能确保它在布局管理器方面的行为相同 - 最重要的是,它具有相同的首选高度并在字体更改时正确调整大小?

1 个答案:

答案 0 :(得分:0)

尝试使用:

g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
          RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
//g2.drawString(...);

在绘制抗锯齿文本之前。 然后当你不需要抗锯齿时,在绘制非抗锯齿文本之前禁用它:

    g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
          RenderingHints.VALUE_TEXT_ANTIALIAS_OFF);
//g2.drawString(...);