package javacodebook.media.draw.fillgradient;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

/**
 * Ein einfaches Panel, um die Zeichenmöglichkeiten in Java zu demonstrieren.
 */
public class FillShapes extends JPanel{

    /**
     * In Swing sollte im Gegensatz zum AWT immer die Methode paintComponent
     * überschrieben werden.
     */
    public void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        Graphics2D g = (Graphics2D) graphics;

        float startx = 10, starty = 10;
        float width=80, height=60;
        //Den Farbverlauf definieren und ein gefülltes Rechteck zeichnen
        //Der Farbverlauf geht von links (schwarz) nach rechts (weiss) linear
        GradientPaint gradient =
            new GradientPaint(startx, starty, Color.black,
                              startx + width, starty, Color.white);
        g.setPaint(gradient);
        g.fill(new Rectangle2D.Double(startx, starty, width, height));

        startx = 110;
        //Farbverlauf diagonal von links oben nach rechts unten
        gradient =
            new GradientPaint(startx, starty, Color.black,
                              startx + width, starty + height, Color.white);
        g.setPaint(gradient);
        g.fill(new Rectangle2D.Double(startx, starty, width, height));

        startx = 20;
        starty = 110;
        //Zyklischer Farbverlauf mit Zentrum in der Mitte
        gradient =
            new GradientPaint(startx, starty, Color.black,
                              startx + width, starty, Color.white, true);
        g.setPaint(gradient);
        g.fill(new Rectangle2D.Double(startx, starty, width*2, height));
    }

    /** Die gewünschte Größe des Panels festlegen */
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);
    }

    /** Einen Frame erzeugen und das Panel anzeigen */
    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().setLayout(new BorderLayout());
        f.getContentPane().add(new FillShapes(), BorderLayout.CENTER);
        f.pack();
        f.show();
    }
}
