package javacodebook.media.draw.stroke;

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

/**
 * Ein einfaches Panel, um die Zeichenmöglichkeiten in Java zu demonstrieren.
 */
public class StrokeExamples extends JPanel{

    /**
     * In Swing sollte im Gegensatz zum AWT immer die Methode paintComponent
     * überschrieben werden.
     */
    public void paintComponent(Graphics graphics) {
        super.paintComponent(graphics);
        //Graphics-Objekt ist in Wahrheit ein Graphics2D-Objekt
        Graphics2D g = (Graphics2D) graphics;
        //aktuelle Zeichenfarbe setzen
        g.setColor(Color.black);
        //Ein Rechteck mit Rahmendicke 5 zeichnen
        BasicStroke fatBorder = new BasicStroke(5.0f);
        g.setStroke(fatBorder);
        g.draw(new Rectangle2D.Double(10, 10, 80, 60));

        //Ein Rechteck mit gestricheltem Rahmen zeichnen
        BasicStroke stroke = new BasicStroke(1.0f,
                                             BasicStroke.CAP_BUTT,
                                             BasicStroke.JOIN_BEVEL,
                                             1.0f, new float[] {5.0f},
                                             0.0f);
        g.setStroke(stroke);
        g.draw(new RoundRectangle2D.Double(110, 10, 80, 60, 15, 15));
        //Rahmen mit verschiedenen Strichlängen zeichnen
        stroke = new BasicStroke(1.0f,
                                 BasicStroke.CAP_BUTT,
                                 BasicStroke.JOIN_BEVEL,
                                 1.0f, new float[] {5.0f, 5.0f, 2.0f, 5.0f},
                                 0.0f);
        g.setStroke(stroke);
        g.draw(new RoundRectangle2D.Double(210, 10, 80, 60, 15, 15));
        //Linien überschneiden sich am Ende ohne Effekt
        stroke = new BasicStroke(10.0f,
                                 BasicStroke.CAP_BUTT,
                                 BasicStroke.JOIN_BEVEL);
        g.setStroke(stroke);
        int x = 25;
        g.draw(new Line2D.Double(x, 160, x+25, 135));
        g.draw(new Line2D.Double(x+25, 135, x+50, 160));
        //Linien überschneiden sich am Ende, Spitze wird gezeichnet
        stroke = new BasicStroke(10.0f,
                                 BasicStroke.CAP_SQUARE,
                                 BasicStroke.JOIN_MITER);
        g.setStroke(stroke);
        x = 125;
        g.draw(new Line2D.Double(x, 160, x+25, 135));
        g.draw(new Line2D.Double(x+25, 135, x+50, 160));
        //Linien überschneiden sich am Ende, Spitze wird abgerundet
        stroke = new BasicStroke(10.0f,
                                 BasicStroke.CAP_ROUND,
                                 BasicStroke.JOIN_ROUND);
        g.setStroke(stroke);
        x = 225;
        g.draw(new Line2D.Double(x, 160, x+25, 135));
        g.draw(new Line2D.Double(x+25, 135, x+50, 160));
    }

    /** Die gewünschte Größe des Panels festlegen */
    public Dimension getPreferredSize() {
        return new Dimension(300, 180);
    }

    /** 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 StrokeExamples(), BorderLayout.CENTER);
        f.pack();
        f.show();
    }
}
