0

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?

Community
  • 1
  • 1
Karol S
  • 9,028
  • 2
  • 32
  • 45
  • "Implementations are free to ignore the hints completely…"—[`RenderingHints`](http://docs.oracle.com/javase/8/docs/api/java/awt/RenderingHints.html) – trashgod Aug 22 '14 at 09:01
  • @trashgod I know, but [OpenJDK 7 on Linux doesn't](http://stackoverflow.com/questions/17346942/intellij-idea-font-smoothing-in-linux). I want it to work wherever it can, and where it can't… well, it can't. – Karol S Aug 22 '14 at 09:34
  • You might look at the hints supplied to the `FontRenderContext` in `TextLayout`, as seen [here](http://stackoverflow.com/a/4287269/2305130). – trashgod Aug 22 '14 at 09:52

1 Answers1

0

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(...);
Marcello Davi
  • 433
  • 4
  • 16
  • Are you referring to the JPanel solution? If so, how do I make such JPanel behave like a JLabel in regards to layout? – Karol S Aug 21 '14 at 23:29