Wie lassen sich Zeichnungen freier Formen realisieren?

Die Klasse GeneralPath erlaubt es, nach und nach freie Formen aus Geraden und Bögen zusammenzusetzen.

Im gezeigten Beispiel wird eine von JPanel abgeleitete Klasse deklariert, deren Methode paintComponent() überschrieben wird. Sie wird immer dann ausgeführt, wenn die Komponente neu gezeichnet wird.
Hier soll die Silhouette eines Stuhls gezeichnet werden. Das Prinzip des Vorgehens besteht darin, dass nacheinander, ausgehend von einem festgelegten Punkt lineare Abschnitte gezeichnet werden, deren Endpunkte wiederum den Startpunkt für den Nachfolgeabschnitt darstellen. Die Methode moveTo() setzt den Initialisierungspunkt der Zeichnung. Es ist dies der obere vordere Anfangspunkt des Vorderbeins. Die Methode lineTo() bekommt zwei double-Werte als Parameter übergeben. Sie stellen den X- und den Y-Wert eines Punktes dar. Zwischen dem Startpunkt und diesem Endpunkt zeichnet die Methode eine Gerade.
Nacheinander werden so die Einzelteile des Vorderbeines gezeichnet. Geschwungene Linien können mittels zweier verschiedener Methoden gezeichnet werden:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;

import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * Zeichnet die Silhouette eines Stuhls
 * 
 */
public class FreieFormZeichnen extends JFrame {
    
    JPanel panel;
    
    public FreieFormZeichnen(){
        panel = new FreiFormPanel();
        add(panel);

        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new FreieFormZeichnen();
    }
}

class FreiFormPanel extends JPanel {
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, this.getWidth(), this.getHeight());
        g2d.setColor(Color.BLACK);
        GeneralPath gp = new GeneralPath();
        
        gp.moveTo(100, 110);    // Vorderbein vorne oben
        gp.lineTo(100, 200);
        gp.lineTo(110, 200);
        gp.lineTo(110, 115);
        gp.quadTo(110, 110, 120, 110);
        gp.lineTo(160, 120);
        gp.lineTo(170, 200);    
        gp.lineTo(180, 200);    
        gp.lineTo(170, 110);        
        gp.quadTo(170, 80, 200, 50);
        gp.quadTo(195, 40, 190, 50);
        gp.quadTo(160, 80, 160, 110);
        gp.quadTo(105, 90, 100, 110);
        
        g2d.draw(gp);
    }
}

Die nachfolgende Grafik zeigt die gezeichnete Ausgabe.

Javabeginners - Java-Tips und Quelltexte für Anfänger