Wie lassen sich Zeichnungen freier Formen realisieren?
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:
- quadTo(double x1, double y1, double x2, double y2)
erzeugt eine sog. quadratische Kurve zwischen dem Startpunkt und dem mit x2/y2 definierten Endpunkt. Der Punkt x1/y1 erzeugt den quadratischen Kontrollpunkt. Das ist der Punkt, der sich aus dem Schnittpunkt der Tangenten des Start- und des Endpunktes ergibt. Durch die Anpassung seiner Lage, können somit die Krümmungen von Beginn und Ende der Kurve beeinflusst werden. - curveTo(double x1, double y1, double x2, double y2, double
x3, double y3)
erzeugt eine kubische Bézier-Kurve mit Zwei Kontrollpunkten. x1/y1 definiert den Kontrollpunkt des Startpunktes, x2/y2 gibt den Kontrollpunkt für den Endpunkt an. Er wird durch x3/y3 festgelegt. Beide Krümmungen können hierdurch getrennt voneinander kontrolliert werden.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.GeneralPath;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class FreieFormZeichnen {
JPanel panel;
public FreieFormZeichnen(){
init();
}
private void init() {
JFrame frame = new JFrame("Freiform zeichnen");
panel = new FreiFormPanel();
frame.add(panel);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> 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);
}
public Dimension getPreferredSize() {
return new Dimension(300, 300);
}
}
Die nachfolgende Grafik zeigt die gezeichnete Ausgabe.
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.