2D-Grafik paintComponent für rechteckigen Bereich?

Bile Demon

Bekanntes Mitglied
Zunächst mal, gerade vor kurzem hab ich hier im Forum etwas gelesen in der Art wie "thou shalt not use getGraphics", was ich irgendwie nicht ganz nachvollziehen kann. Wie kann man denn sonst noch in ein BufferedImage zeichnen, wenn ich mir kein Graphics-Objekt holen darf? Eine Begründung wäre da echt toll gewesen, weil die Aussage alleine hilft mir nicht.

Ich arbeite derzeit wieder mal an einem kleinen Experiment und da bin ich am überlegen, wie ich performant mit Swing arbeiten kann. Das Fensterchen (JFrame) hat kaum VGA-Auflösung, sollte aber mit 72 fps immer ein BufferedImage auf ein JPanel zeichen.

Im Moment ist das Bild testweise noch komplett schwarz. Mit Hilfe eines Timers lasse ich den Thread immer so lange schlafen, dass er mehr oder weniger genau auf diese 72 fps kommt (theoretisch wären 300 fps drin, laut Timer).

Was mich daran stört, ist, dass schon das simple Zeichnen dieses immergleichen schwarzen BufferedImages meinen Prozessor zu 15% auslastet, um auf die benötigte Bildwiederholrate zu kommen. Ich weiß nicht wie ihr das seht, aber ich finde das etwas viel. Wie sieht das dann erst aus, wenn ich komplizierte Berechnungen ausführe, um tatsächlich Bildschirminhalt zu erzeugen.

Nun habe ich gelesen, dass man repaint(x1,y1,x2,y2) überschreiben kann, damit NUR der Bereich neu gezeichnet wird, der sich verändert hat. Das wäre natürlich genau das richtige für mich, weil bei meinem Experiment komplette Bildbereiche immer gleich bleiben. Auch wenn das OS das Fenster anweist, einen Teil von sich neu zu zeichen, dann sollte mein JFrame sich die Arbeit sparen und eben nicht alles neu zeichnen. Nun nützt mir aber repaint nichts, wenn die paintComponent()-Methode, die ich überschreibe, keine Parameter nimmt und daher immer alles neu zeichnet.

Verstehe ich da was falsch oder ist paintComponent() da der falsche Weg? Wie macht man sowas besser?
 

Michael...

Top Contributor
Zunächst mal, gerade vor kurzem hab ich hier im Forum etwas gelesen in der Art wie "thou shalt not use getGraphics", was ich irgendwie nicht ganz nachvollziehen kann. Wie kann man denn sonst noch in ein BufferedImage zeichnen, wenn ich mir kein Graphics-Objekt holen darf? Eine Begründung wäre da echt toll gewesen, weil die Aussage alleine hilft mir nicht.
Diese Aussage gilt nur für Komponenten (JPanel...) hier sollte man sich das Graphics Objekt mittels getGraphics() holen - zum einen weil man nie sicher gehen kann ob und was geliefert wird, sondern innerhalb der überschriebenen paintComponent zeichnen.
Für BufferedImages gilt das nicht hier kann/muss man sich das Graphics Objekt über diese oder noch besser via createGraphics() holen.
Was mich daran stört, ist, dass schon das simple Zeichnen dieses immergleichen schwarzen BufferedImages meinen Prozessor zu 15% auslastet, um auf die benötigte Bildwiederholrate zu kommen. Ich weiß nicht wie ihr das seht, aber ich finde das etwas viel. Wie sieht das dann erst aus, wenn ich komplizierte Berechnungen ausführe, um tatsächlich Bildschirminhalt zu erzeugen.
Die Auslastung/Belastung ist hier unabhängig davon ob das Bild schwarz oder kunterbunt ist. Schwierig wird es nur wenn mit 72fps immer ein neues BufferdImage gemalt bzw. das bestehende komplett übermalt werden soll.
Eventuell sollte man diese Änderungen direkt auf die Komponente zeichnen.
Nun habe ich gelesen, dass man repaint(x1,y1,x2,y2) überschreiben kann, damit NUR der Bereich neu gezeichnet wird, der sich verändert hat. Das wäre natürlich genau das richtige für mich, weil bei meinem Experiment komplette Bildbereiche immer gleich bleiben. Auch wenn das OS das Fenster anweist, einen Teil von sich neu zu zeichen, dann sollte mein JFrame sich die Arbeit sparen und eben nicht alles neu zeichnen. Nun nützt mir aber repaint nichts, wenn die paintComponent()-Methode, die ich überschreibe, keine Parameter nimmt und daher immer alles neu zeichnet.
Habe nie etwas mit repaint(int, int, int, int) gemacht. Aber man kann mit setClip am Graphics Objekt den neu zu zeichnenden Bereich einschränken.
 

Bile Demon

Bekanntes Mitglied
Danke für deine Anmerkungen.

Schwierig wird es nur wenn mit 72fps immer ein neues BufferdImage gemalt bzw. das bestehende komplett übermalt werden soll.

Und genau so wird es wohl tatsächlich ablaufen. Der Application-Thread verwendet zwar bestehende Objekte und erzeugt keine neuen, aber er muss 72 mal in der Sekunde Bilder ineinander zeichnen und so das BufferedImage übermalen. Das JPanel sollte sich dann jeweils neu zeichnen.

Eventuell sollte man diese Änderungen direkt auf die Komponente zeichnen.

Du meinst direkt mit getGraphics/createGraphics auf das JPanel ohne Umwege über das BufferedImage? Gibt das nicht hässliche Verzerrungen oder Bildschirmflackern? Thema Double Buffering meine ich.

Aber man kann mit setClip am Graphics Objekt den neu zu zeichnenden Bereich einschränken.

Danke, das schaue ich mir bei Gelegenheit mal an. Wird denn der neu zu zeichnende Bereich auch vom Betriebssystem gesetzt, so dass ich ihn abfragen kann? Oder erwartet das OS generell, dass sich das gesamte Fenster neu zeichnet?
 

Bile Demon

Bekanntes Mitglied
Hallo André. Danke, die Tutorials sind echt super. Da steht ja alles.

Ich habe mittlerweile ja schon so einige Swing/AWT-Tutorials durch, und nicht alle Tutorials sind sich in solchen Punkten einig bzw. klären alles auf. Ich hab da wirklich schon die unterschiedlichsten Sachen gelesen, da weiß man am Ende manchmal weniger als vorher.

Aus diesem Grund habe ich auch lange Zeit direkt in einen JFrame gezeichnet, weil das eben irgendwo stand und weil es funktioniert hat. Inzwischen mach ich das ganz konventionell über eine JComponent.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
T paintComponent() überschreiben: Platz für Border freihalten? AWT, Swing, JavaFX & SWT 6
G paintComponent() Methode für JPanel in NetBeans überschreibe AWT, Swing, JavaFX & SWT 2
P paintComponent-Methode wird dauernd neu aufgerufen AWT, Swing, JavaFX & SWT 2
H new Operator in paintComponent - Speicherprobleme vorprogrammiert? AWT, Swing, JavaFX & SWT 2
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
G update, paintComponent AWT, Swing, JavaFX & SWT 1
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
L Swing repaint() ruft paintComponent(g1d) nicht auf AWT, Swing, JavaFX & SWT 12
C Objekt an paintComponent weitergeben AWT, Swing, JavaFX & SWT 1
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
D PaintComponent wird nicht aufgerufen AWT, Swing, JavaFX & SWT 3
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I (JPanel) paintComponent mit Zeitverschiebung (Sleep/Wait) AWT, Swing, JavaFX & SWT 1
K Swing paintComponent, JPanel auslagern, ChangeEvents AWT, Swing, JavaFX & SWT 7
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
B AWT paintComponent wird nur 2 mal ausgeführt?! AWT, Swing, JavaFX & SWT 5
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
D paintComponent() mit transparentem Hintergrund. AWT, Swing, JavaFX & SWT 0
G Swing Flackern nach Override von paintComponent() AWT, Swing, JavaFX & SWT 3
M Swing paintComponent in rekusivem JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 2
M DefaultTableModel ruft paintComponent auf ! AWT, Swing, JavaFX & SWT 4
T Swing paintComponent(); AWT, Swing, JavaFX & SWT 24
K Swing JButton paintComponent überschreiben AWT, Swing, JavaFX & SWT 5
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
P Swing problem mit paintComponent AWT, Swing, JavaFX & SWT 2
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
K paintComponent nicht aufgerufen AWT, Swing, JavaFX & SWT 2
J Mal wieder Probleme mit paintComponent AWT, Swing, JavaFX & SWT 3
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
S auf paintComponent() warten AWT, Swing, JavaFX & SWT 34
W JPanel Überschreiben // paintComponent? AWT, Swing, JavaFX & SWT 4
propra Wieso wird paintComponent() beim Start 2 malausgeführt? AWT, Swing, JavaFX & SWT 4
T BufferedImage bei paintComponent AWT, Swing, JavaFX & SWT 6
P JLabel paintComponent AWT, Swing, JavaFX & SWT 3
Z Swing paintcomponent und menbar Problem AWT, Swing, JavaFX & SWT 3
S Image wird nicht (immer) in paintComponent gezeichnet? AWT, Swing, JavaFX & SWT 6
R 2D-Grafik auf JPanel zeichen - ohne @Override paintComponent AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent & BorderFactory AWT, Swing, JavaFX & SWT 2
A paintComponent AWT, Swing, JavaFX & SWT 4
T Rechtecke zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 3
R paintComponent direkt bei actionPerformed aufrufen AWT, Swing, JavaFX & SWT 2
P Swing Vom BufferedImage bei paintComponent nur soviel zeichnen, wie nötig AWT, Swing, JavaFX & SWT 3
P Swing Frage zu paintComponent/getGraphics AWT, Swing, JavaFX & SWT 4
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2
K JPanel und paintComponent AWT, Swing, JavaFX & SWT 8
E 2D-Grafik Zeichnen außerhalb der "paintComponent"-Methode? AWT, Swing, JavaFX & SWT 5
C Checkbox in Liste deaktivieren und paintComponent explizit aufrufen AWT, Swing, JavaFX & SWT 12
C Performance-Problem beim Überschreiben von paintComponent() AWT, Swing, JavaFX & SWT 2
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B Anzeigefehler in GridBagLayout durch paintComponent(Graphics g) AWT, Swing, JavaFX & SWT 3
J Swing paintComponent() - repaint() - BufferedImage anzeigen AWT, Swing, JavaFX & SWT 5
J paintComponent() übergeben AWT, Swing, JavaFX & SWT 4
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
kodela Swing paintComponent() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 19
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
E WARUM wird paintComponent nicht aufgerufen? AWT, Swing, JavaFX & SWT 12
C paintComponent mit Maus verschieben - wie? AWT, Swing, JavaFX & SWT 2
G Swing paintComponent Effizienz? AWT, Swing, JavaFX & SWT 4
R paintComponent Kollision AWT, Swing, JavaFX & SWT 2
D Fragen zu Swing, paintComponent() und repaint AWT, Swing, JavaFX & SWT 6
A Probleme mit paintComponent() AWT, Swing, JavaFX & SWT 2
T Swing paintComponent problem AWT, Swing, JavaFX & SWT 3
MrGe getWidth(); getHeight(); außerhalb von paintComponent AWT, Swing, JavaFX & SWT 4
A paintComponent überdeckt ... AWT, Swing, JavaFX & SWT 13
F Wer ruft paintComponent() Methode auf? AWT, Swing, JavaFX & SWT 9
@ JPanel: kein paintComponent() trotz repaint() AWT, Swing, JavaFX & SWT 4
G paintComponent Problem AWT, Swing, JavaFX & SWT 6
G paintComponent JPanel im JApplet AWT, Swing, JavaFX & SWT 2
X Speichern in der paintComponent() Methode AWT, Swing, JavaFX & SWT 15
W JLabel + paintComponent AWT, Swing, JavaFX & SWT 2
V Wieviel Logik in paintComponent? AWT, Swing, JavaFX & SWT 7
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
L Problem mit paintComponent() under java < 1.6 under Windo AWT, Swing, JavaFX & SWT 3
H eigene paintComponent(Graphics) kommt mit rezise nicht klar AWT, Swing, JavaFX & SWT 6
N Probleme mit paintComponent und GradientPaint AWT, Swing, JavaFX & SWT 5
B JPanel#paintComponent(Graphics g) << flackert oO AWT, Swing, JavaFX & SWT 3
D performance problem: paintcomponent, alphacomp, bufferedImag AWT, Swing, JavaFX & SWT 10
A Probelme mit großen BufferedImage in paintComponent AWT, Swing, JavaFX & SWT 7
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4
K Problem repaint()->paintComponent AWT, Swing, JavaFX & SWT 9
G paintComponent wird nicht dargestellt AWT, Swing, JavaFX & SWT 5
T Kuchendiagramm - mit paintComponent nach JButton druck zeich AWT, Swing, JavaFX & SWT 4
R paintComponent wird anscheinend nicht aufgerufen AWT, Swing, JavaFX & SWT 2
T JPanel mit paintComponent methode im JInternalFrame AWT, Swing, JavaFX & SWT 3
M super.paintComponent(g); aufrufen oder nicht? AWT, Swing, JavaFX & SWT 8
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
D JTextArea in der paintComponent () hinzufügen? AWT, Swing, JavaFX & SWT 9
raptorrs J2D paintComponent: Nur ganzzahlige (-int) Werte möglich? AWT, Swing, JavaFX & SWT 3
B Schon wieder ein Problem mit paintComponent(). AWT, Swing, JavaFX & SWT 2
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben