Effizientes zeichnen mit Swing

Status
Nicht offen für weitere Antworten.

Fabian23

Aktives Mitglied
Hallo zusammen,

ich stehe im Moment vor dem Problem, viele grafische Objekte auf einem JPanel zeichnen zu müssen. Diese Objekte sind editierbar (Größe, Position etc.).

Das Problem dabei ist, dass dieses zeichnen nicht wirklich performant ist. Beim Bewegen einer Figur beispielsweise steigt die Prozessorlast auf 100%.

Folgendermaßen zeichne ich:

Ich habe die einzelnen Objekte gekapselt und denen eine paint-Methode verpasst. Die Objekte, die sich logisch auf dem JPanel befinden, liegen alle in einem Vector. Wird das JPanel neu gezeichnet, zeichne ich erst einen Hintergrund und gehe dann den Vector durch, und rufe für jedes Objekt die Paint-Methode auf (ich übergebe das Graphics-Objekt). Dadurch zeichnen sich die ganzen Figuren auf dem JPanel.

Was ich schon rausgefunden habe, ist, dass jedes Objekt, dass neu gezeichnet werden will, ein repaint des JPanels aufruft und dadurch die gesamte Collection der Objekte durchgegangen wird. Das ist auf jeden Fall nicht performant.

Habt ihr Ideen, wie man effizient auf ein JPanel (oder einem anderen Control) zeichnen kann? Ich weiß leider nicht, wie ich das Zeichnen verbessern kann.

Bin auf Ideen jeglicher Art, Links, Tipps und Tricks oder was auch immer gespannt :).


Gruß,
Fabian
 

m@nu

Bekanntes Mitglied
1. bau dir clipping in deine paint-methoden ein. somit sagst du java, welcher bereich gezeichnet werden soll (nicht vergessen wieder zurückzusetzen!)
Code:
g.setClip(x,y,w,h);
//...
g.setClip(0,0, getWidth(), getHeight());

2. schau zu, dass wenn repaint() aufgerufen wird, du dort ebenfalls den bereich mitgeben kannst, welcher neu gezeichnet werden soll (hat mir kürzlich extrem geholfen :arrow: http://www.java-forum.org/de/viewtopic.php?p=238612#238612)
Code:
repaint(x,y,w,h);

und zu guter letzt 3.
nicht die paint-methode vom JPanel überschreiben (macht man einfach nicht ;) ) ... schreib dir den eigenen code in der paintComponent() methode.

das mit der prozessorlast läst irgendwie darauf schliessen, dass du ein problem mit den repaintings bekommst. kann sein das sich dein code da irgendwie in eine endlosschleife verläuft? (hatte ich 'mal... bekam direkt StackOverflow-Exceptions, welche ich mir erst nach 1-tägigem debuggen erklären konnte ;) )

hoffe das hilft dir irgendwie weiter :) ansonsten wieder melden und evtl. code posten :)


info am rande: du zeichnest nicht mit swing, du zeichnest mit AWT resp Java2D (wenn du Graphics2D verwendest :) ) ... swing is nur die GUI bibliothek. (ja ich weis, gibts bei AWT auch, aber ist dort halt der selbe name)
 

Wildcard

Top Contributor
Fabian23 hat gesagt.:
Was ich schon rausgefunden habe, ist, dass jedes Objekt, dass neu gezeichnet werden will, ein repaint des JPanels aufruft und dadurch die gesamte Collection der Objekte durchgegangen wird. Das ist auf jeden Fall nicht performant.
Das muss ja einen Grund haben. Warum ist das so? Zeig mal Beispielcode?
Bringt nicht übermäßig viel, aber schonmal ein Anfang:
Mach aus deinem Vector eine LinkedList. Bei sequentiellem Zugriff ist die schneller.
 

kaie

Bekanntes Mitglied
An dem grundsätzlichen Vorgehen dürfte es nicht liegen, das sollte von der Performanz keine Probleme bereiten. Ich arbeite hier an einer Verkehrssimulation, die nach dem gleichen Prinzip mehrere Tausend Objekte (Autos, Straßen, Fußgänger, Hilfslinien) gleichzeitig darstellt, und dabei sogar noch einigermaßen performant bleibt.

Dein Grundschema sollte wie folgt aussehen:
Code:
public class Bild extends JPanel
{
  public Vector objekte = new Vector();
  public void paintComponent( Grapics g )
  {
    super.paintComponent(g);
    for( int i=0; i<objekte.size(); j++ )
    {
      ((Component)objekte.elementAt(i)).paint(g);
    }
  }
}
Damit solltest Du eigentlich alles ohne Probleme zeichnen können. Und das repaint() musst Du nur aufrufen, wenn sich irgendwo was ändert.
 

Fabian23

Aktives Mitglied
Hallo zusammen,

danke für die vielen Antworten und zahlreichen Tipps.

@m@nu: Das mit dem clipping und dem repaint(Rectangle) ist eine gute Idee. Im Moment habe ich noch Probleme, weil nicht richtig neu gezeichnet wird. Da probiere ich aber noch mal rum.

Die paint-Methode habe ich nicht überschrieben. Habe ich mich wohl falsch ausgedrückt. Ich habe meine Zeichenoperationen in die paintComponent-Methode eingebaut.

Eine Endlosschleife habe ich wohl nicht drin. Zumindest hört die Prozessorlast ja irgendwann auf und eine StackOverflowException erhalte ich auch nicht :).

@Wildcard: Das hat den Grund, weil ich es so programmiert habe :). Immer, wenn sich etwas in einem Shape ändert, wird das repaint() des JPanels aufgerufen und eben alle Shapes neu gezeichnet. Sollte man das evtl. auch ändern?

Den Vector werde ich mal in eine LinkedList ändern.

@kaie: Danke für die Beruhigung, dass ich anscheinend nicht alles grundlegend falsch gemacht habe. So wie Dein Code-Beispiel sieht der Part meiner paintComponent-Methode aus, die alle Shapes zeichnet.
 

André Uhres

Top Contributor
Wenn man die ganze Vectorzeichnerei auf ein Offscreenbild machen würde und einfach nur das fertige Bild in paintComponent zeichnet, geht repaint dann nicht schneller?
 

Fabian23

Aktives Mitglied
@André Uhres: Das habe ich mich auch schon gefragt. Allerdings habe ich dann doch einen Schritt mehr beim Zeichnen oder? Erst alles auf ein Bild und dann aufs JPanel, statt direkt alles aufs JPanel. Ist das nicht langsamer?
 

byte

Top Contributor
Wenn Du nur die Objekte neu ins Bild zeichnen lässt, die sich auch wirklich geändert haben und dann das Bild in repaint() darstellst, sollte das schon deutlich schneller sein, als wenn Du immer alles direkt neu zeichnest.
 

Fabian23

Aktives Mitglied
Gibt es eine bestimmte Vorgehensweise, wenn ich zuerst auf das Bild zeichne? Welchen Typ Bild sollte man nehmen (BufferedImage) oder ist das egal?

Hat jemand vielleicht ein Beispiel, wie man es machen sollte?
 
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

Neue Themen


Oben