Zeichnen verschiedener geom. Figuren in einem JPanel

Status
Nicht offen für weitere Antworten.
Hallo,
ich bin dabei ein 'Zeichnungsfenster' zu entwickeln, auf das verschiedene geometrische Figuren gezeichnet werden können (Polygone, Punkte, Kurven etc.)
Ich habe nun eine allgemeine Frage zur Entwicklung dieses Fensters.
Ist es sinvoll, diese verschiedenen Figuren alle in der der paint-Methode des Fensters zu zeichnen?
Eine Idee wäre, alle zu zeichnenden unterschiedlichen Figuren in verschiedenen Listen zu speichern (z.b. Polygonliste, Punkteliste etc.) und dann in der paint-Methode alle Listen abzufragen und mit der entsprechenden Methode zu zeichnen.
Besserer objektorientierter Stil scheint es mir allerdings, die einzelnen Figuren in eigenen Klassen von eigenen Methoden zeichnen zu lassen und dann die Komponenten mit add() auf das Fenster zu bringen. Ich müsste dann aber wohl den Hintergrund der einzelnen Komponenten stets transparent setzen und habe gelesen, dass dies oftmals Permormance Probleme nach sich zieht.
Ich bin noch ein ziemlicher Programmieranfänger und wäre für einen Tipp sehr dankbar.

Viele Grüße
winterwanderer
 

Marco13

Top Contributor
Ja, da gibt's verschiedene Möglichkeiten... Alles folgende sind keine Empfehlungen, sondern nur Inspirationen und mögliche Argumentationen:

1. Möglichkeit (Schlecht)

Für jede Figur gibt es eine Klasse mit einer passenden Methode zum Zeichnen. Die objekte liegen in verschiedenen Listen
Code:
class Circle { public void drawCircle(Graphics g) { ... } }
class Polygon { public void drawPolygon(Graphics g) {.... } }

class Painter extends JPanel
{
    List<Circle> circles = ...
    List<Polygon> polygons = ...

    public void paintComponent(Graphics g)
    {
        for (Circle circle : circles) circle.drawCircle(g);
        for (Polygon polygon : polygons) polygon.drawPolygon(g);
    }
}

Das ist unflexibel, un-objektorientiert, und sehr schlecht erweiterbar: Der "Painter" muss für jede Klasse extra um eine neue Liste erweitert werden...


2. Möglichkeit ("Üblich")

Die Klassen implementieren ein gemeinsames Interface, das besagt, dass sie gezeichnet werden können. Alle zeichenbaren Objekte liegen in EINER Liste
Code:
interface Drawable { public void draw(Graphics g); }

class Circle implements Drawable{ public void draw(Graphics g) {.... } }
class Polygon implements Drawable { public void draw(Graphics g) { ....} }

class Painter extends JPanel
{
    List<Drawable> drawable = ...

    public void paintComponent(Graphics g)
    {
        for (Drawable drawable : drawables) drawable.draw(g);
    }
}

Das ist schon besser, weil man beliebige neue Klassen hinzufügen kann: WENN sie das interface implementieren, kann man sie einfach an den "Painter" schicken, und der zeichnet sie dann.

Allerdings könnte man argumentieren, dass die Klassen eigentlich nichts darüber wissen sollten, WIE sie gezeichnet werden. D.h. eigentlich sollten sie sich (in gewissen Sinne Model-View-Controller-konform) nicht SELBST zeichnen. Man könnte das erreichen, indem man dadizierte Renderer anbietet...


3. Möglichkeit ("MVC-konform")

Für jede Klasse gibt es einen Renderer, der ein bestimmtes Interface implementiert
Code:
interface Renderer { public void draw(Graphics g); }

class Circle { getRadius, getCenter.... }
class CircleRenderer implements Renderer
{
    private Circle circle;
    public void draw(Graphics g) 
    { 
        g.drawOval(..circle.getCenter...circle.getRadius...);
    }
}

class Polygon { getPoint(int index).... }
class PolygonRenderer implements Renderer
{
    private Polygon polygon;
    public void draw(Graphics g) 
    { 
        ... 
    }
}

class Painter extends JPanel
{
    List<Renderer> drawable = ...

    public void paintComponent(Graphics g)
    {
        for (Renderer drawable : drawables) drawable.draw(g);
    }
}

Der Vorteil wäre, dass ein "Circle" dann wirklich nur ein abstraktes Datenmodell ist, das die Daten für einen Kreis speichert. WIE der WO hin gezeichnet wird, ist Sache des Renerers....


Aber spätestens, wenn du diese Objekte auch noch editieren willst, musst du dir sowieso (im Vorfeld, bevor du los-implementierst) noch VIIEEEL mehr Gedanken machen...
 
Hallo Marco13,
erstmal danke für die sehr ausführliche Antwort. Sie hilft mir auf jeden Fall weiter. Mir war es klar, dass
es nicht objektorientiert sein kann, alles in die paintComponent Methaode des Zeichenfensters hineinzupacken.
Von daher wollte ich es eigentlich so machen, wie du es in der 2.Methode skizziert hast. Was mir allerdings nicht klar war, und auch noch nicht ganz klar ist, sind die folgenden Punkte:
1. Besitzen die einzelnen 'Drawable-Klassen' automatisch die gleiche Graphik-Umgebung wie mein JPanel.
Also entspricht z.B. automatisch der Punkt (0,0) in meiner 'Drawable-Klasse' Polygon dem Punkt (0,0) auf meinem
JPanel?
2. Wenn ich einer Drawable-Klasse z.B. einen geschlossenen Linienzug zeichne, muss ich dann den Hintergrund
transparent setzen, damit z.B. ein Punkt innerhalb des Linienzuges noch sichtbar ist oder wird bei einem Zeichnen
von Linien automatisch nur die Linie gezeichnet und der Hintergrund bleibt unverändert?

Wenn Zeit vorhanden ist, die Fragen noch zu beantworten, freue ich mich, wenn nicht, machts aber auch nichts. Ich werde das jetzt einfach mal ausprobieren und denke, dass ich nun schon weiterkomme.
Viele Grüße
winterwanderer
 
S

SlaterB

Gast
die Objekte in der Liste sind hier keine eigenen JComponents, die per add() hinzugefügt wurden,
sondern simple leere Klassen, die eine Methode
public void draw(Graphics g);
implementieren

dass Code in einer Methode steht, ist für sich keine Magie, die irgendwelche Hintergründe setzt oder Ursprünge verschiebt,

was immer an Code in draw() steht hat exakt die selben Auswirkungen, wie wenn er direkt in
paintComponent(Graphics g)
von Painter stände
 

Marco13

Top Contributor
Also 1. Nein und 2. Wenn man z.B. drawCircle macht (und nicht fillCircle) bleibt der Hintergrund unverändert. Ob "draw" oder "fill" könnte z.B. durch ein boolean "filled" bestimmt werden, das man bei jedem Drawable(!????!) von außen mit setFilled(true/false) setzen kann...
 
die Objekte in der Liste sind hier keine eigenen JComponents, die per add() hinzugefügt wurden,
sondern simple leere Klassen, die eine Methode
public void draw(Graphics g);
implementieren
Ja, das isses. Da lag mein Gedankenfehler. Irgendwie hab ich die ganze Zeit gedacht, ich müsste nun JComponents dazuaddieren und mir nun Gedanken machen, über Hintergrund, Layout etc.




[/quote]
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Zeichnen einer sich bewegenden Box mit BufferStrategy zieht Spur AWT, Swing, JavaFX & SWT 2
T AWT Bild laden und transparent zeichnen AWT, Swing, JavaFX & SWT 2
Helgon Swing Mit Swing zeichnen / NetBeans GUI AWT, Swing, JavaFX & SWT 11
M JLabel über JButtons zeichnen AWT, Swing, JavaFX & SWT 4
J JApplet und Zeichnen AWT, Swing, JavaFX & SWT 8
P 2D-Grafik NPE beim Zeichnen auf Graphics g AWT, Swing, JavaFX & SWT 8
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
T Zeichnen von getSubimage funktioniert nicht AWT, Swing, JavaFX & SWT 7
M Bilder zeichnen, NullPointer Exception AWT, Swing, JavaFX & SWT 3
N JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
D Zeichnen eines Barplots AWT, Swing, JavaFX & SWT 2
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
M Suche Javabibliothek zum Zeichnen mathematischer Funktionen AWT, Swing, JavaFX & SWT 11
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
P ScrollPane nach zeichnen dynamisch resize AWT, Swing, JavaFX & SWT 7
M Swing In GUI-Builder-JFrame mit Menü Schreiben und Zeichnen AWT, Swing, JavaFX & SWT 4
N 2D-Grafik 2 Probleme beim zeichnen AWT, Swing, JavaFX & SWT 18
S Swing Bild auf jPanel nach Änderung von JComboBox zeichnen AWT, Swing, JavaFX & SWT 4
C Funktionen zeichnen AWT, Swing, JavaFX & SWT 16
P JPanel neu zeichnen AWT, Swing, JavaFX & SWT 10
M Auf einem Hintergrundbild zeichnen AWT, Swing, JavaFX & SWT 2
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T Oval auf ein JPanel zeichnen AWT, Swing, JavaFX & SWT 3
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
S Font laden, Wort zeichnen und animieren..? AWT, Swing, JavaFX & SWT 2
S Bild von Punkt zu Punkt zeichnen AWT, Swing, JavaFX & SWT 8
U Pixel zeichnen AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen


Oben