package javacodebook.media.text.antialias;

import java.awt.*;
import javax.swing.*;

/**
 *  Ein Label mit per Antialias geglättetem Text.
 */
public class AntialiasedLabel extends javax.swing.JPanel {
    private String text;

    public AntialiasedLabel(String text) {
        this.text = text;
    }

    /**
     * Text mit eingeschaltetem Antialising zeichnen.
     */
    public void paintComponent(Graphics g) {
        //Das Panel korrekt darstellen
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        //Antialiasing einschalten
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                                  RenderingHints.VALUE_ANTIALIAS_ON);
        g2.drawString(text, 0, 0 + getFont().getSize());
    }

    /**
     * Das Panel hat eine optimale Größe, die von der Schriftart und -größe
     * abhängt. Diese werden hier berechnet.
     */
    public Dimension getPreferredSize() {
        //Zur Laufweitenberechnung wird ein FontMetrics-Objekt benötigt
        FontMetrics fm = getFontMetrics(getFont());
        //Länge des Textes in Pixel berechnen
        int width = fm.stringWidth(text);
        //Schriftgröße als Höhe
        int height = fm.getHeight();
        return new Dimension(width, height);
    }

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new BorderLayout());
        AntialiasedLabel l = new AntialiasedLabel("Mit Antialias");
        Font font = new Font("Helvetica", Font.BOLD, 24);
        l.setFont(font);
        f.getContentPane().add(l, BorderLayout.NORTH);
        JLabel label = new JLabel("Ohne Antialias");
        label.setFont(font);
        f.getContentPane().add(label, BorderLayout.SOUTH);
        f.pack();
        f.show();
    }
}
