Swing paintComponent Effizienz?

geneticZ

Bekanntes Mitglied
Hallo,
vor ab muss ich gestehen, dass ich leider nicht all zu viel Erfahrung bezüglich Swing und derer Paint Methodik habe.

Ich skaliere in meinem Programm ein BufferedImage "OnTheFly" mittels drawImage, was auch wunderbar funktioniert.
Hierzu habe ich mich sowohl hier im Forum als auch mit externen Links wie z.B.
The Perils of Image.getScaledInstance() | Java.net
oder
Malen in AWT und Swing - Byte-Welt Wiki informiert.

Überall lese ich, man sollte kein getGraphics verwenden sondern alle Malvorgänge in der paintComponent-Methode selber überschreiben. Ist doch richtig oder? Darunter leidet aber extrem die Geschwindigkeit meiner Software.
Hier mal mein Snippet:
[Java]
@Override
public void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D) g;
super.paintComponent(g);
g2.setColor(backgroundCol);
g2.fillRoundRect(0, 0, SIZE.width, SIZE.height, 10, 10);
g2.setColor(borderCol);
g2.setStroke(new BasicStroke(1.0f));
g2.draw(roundedRectangle);
g2.drawImage(img, scale.x, scale.y, scale.width, scale.height, null);
g2.setColor(Color.BLACK);
g2.setFont(font1);
g2.drawString(title, titleWidth, 90);
g2.dispose();
}
[/Java]

Vielleicht hab ich das auch komplett falsch verstanden, jedenfalls wäre ich sehr dankbar wenn mir jemand ein paar Tips geben könnte.

mfg
geneticZ
 
Java API: JComponent#paintComponent: "...If you override this in a subclass you should not make permanent changes to the passed in Graphics..."
destwegen ich würd am Schluss nicht
Code:
g2.dispose();
aufrufen, k.a. ob das was an der Performance ändert.
 
Neeja, das dispose hat damit eigentlich nichts zu tun... Aber ob man das in der paintComponent aufrufen sollte? Wohl eher nicht...

getGraphics() ist übrigens nur auf Components böse. Auf einem BufferedImage darf (muss) man das aufrufen. Und das Graphics, das man DORT bekommt, sollte man am Ende dann 'dispose'n.

So wie das klingt, ist es irgendwie durch paintComponent langsamer geworden... wie war es denn vorher?

Das skalierte Zeichnen an sich ist langsam. Muss das denn wirklich in den paintComponent skaliert werden, oder kann das nicht woanders passieren?
 
Das Bild beim Ändern der Skalierung gleich als skalierte Kopie vorzubereiten ist sicher eine gute Idee.

Nur am Rande: [c]dispose()[/c] ruft immer der auf, der das Graphics-Objekt angefordert hat. [c]paintComponent(Graphics)[/c] bekommt Graphics übergeben und ist damit nicht Eigentümer des Objekts. Daher darf [c]paintComponent(...)[/c] auch nicht [c]dispose[/c] rufen. Anders sieht das aus, wenn man auf einer Kopie arbeitet, was man immer dann tun sollte, wenn man das Graphics-Objekt verändert. Dort sieht das übliche Muster in etwa so aus:
Java:
@Override
protected void paintComponent(Graphics g) {
  super.paintComponent(g);
  final Graphics copy = g.create(); // we create, so we are the owner
  try {
    // do your bad stuff on the copy
  } finally {
    copy.dispose(); // owner must dispose the Graphics object
  }
}
Ebenius
 

Neue Themen


Zurück
Oben