简体   繁体   中英

How to make a single JComponent render aliased text in Swing?

Related answer, but not working under OpenJDK 7: https://stackoverflow.com/a/2266260/1648987 (The SwingUtilities2 class moved and changed its API.)

I want to display several labels and I want them to be toggleable between being rendered with antialiasing or not. I'm doing it for comparison purposes to see how fonts are rendered with and without antialiasing. For now, I'm trying to achieve that by subclassing JLabel . Here is what I have:

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);
    }
}

But it does nothing. Labels are all antialiased no matter what.

I'm using OpenJDK7 on Linux, but I want it to work on Java 8 too.

I'm also considering switching to a manually painted JPanel (you know, @Override public void paint(Graphics g) , this kind of stuff). If I were to do so, how can I make sure it behaves the same in regards to layout managers – most importantly, it has the same preferred height and resizes properly upon font change?

Try to use:

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

Before draw antialiased text. And then when you don't need antialiasing, disable it before draw non-antialiased text:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM