Wieviel Logik in paintComponent?

Status
Nicht offen für weitere Antworten.

Verjigorm

Top Contributor
Hallo, wenn ich mal das Tutorial von Wildcard zitieren darf:
"Das daraus resultierende Fazit lautet: In paintComponent wird nur gezeichnet "

Nun frag ich mich nen bissl, was "Logik" genau beinhaltet :)
Ich habe mehrere Drawimages, die in einer Schleife gezeichnet werden

Code:
		      int width = img.getWidth();
		      while(width < getWidth()-10)
		      {
			      g.drawImage(img , 10 + width - img.getWidth(), (getHeight()-img.getHeight())/2, null);
		    	  width += img.getWidth();
		      }

Geht sowas in Ordnung?

Sind ja immerhin einige Schleifendurchläufe mit "Rechenoperationen" und von diesen Schleifen gäbe es bis zu 36!
Im Endeffekt will ich ein Bild solange von Links zeichnen, bis es an den "rechten Panelrand stößt" (Bild nicht skalieren, sondern fortsetzen!)

geht das irgendwie besser,einfacher oder ist das so ok?
(ich kann leider momentan noch keine wirkliche Aussage zur Performance machen)


mfg Verjigorm
 

Quaxli

Top Contributor
Das kommt darauf an, was Du vorhast. Bei "kleinen" Programmen ist es vertretbar, denke ich.

Grundsätzlich würde ich es aber in eine eigene Kasse packen, nennen Sie wir mal vereinfacht MyImage.
Der würde ich zwei Methoden verpassen:
- checkSize();
- paintImage(Grahpics g);

Bei jedem Schleifendurchlauf geschieht dann Folgendes: Mit checkSize() würde ich prüfen, ob nach Platz bis zum Rand ist und entsprechende Variablen fortschreiben und in paintImage auch nur ein g.drawImage(....) aufrufen.

Und in paintComponent(Graphics g) würde dann auch nur paintImage(g) der Instanz von MyImage aufgerufen.

Und zu dem was Du vorhast wäre es interessant, was Du eigentlich willst. Wenn das periodisch durchgeführt werden soll, wäre es vermutlich sinnvoll, das nur einmal zu machen: Nämlich indem Du ein BufferedImage mit geeignerter Größe erzeugst, Dein Bilder das reinmalst und danach nur noch das BufferedImage zeichnest.
 

Marco13

Top Contributor
Hm. In diesem Fall ist das "while" IMHO weniger kritisch. Man sollte in der paintComponent keine Logik unterbringen, aber das bißchen Logik, was entscheidet, ob ein Image gemalt wird, steht in keinem Verhältnis zum Aufwand, das Image tatsächlich zu zeichnen. (Wie du dieseSchleife aus der paintComponent raus ziehen willst, ist mir aber sowieso nicht klar ... ???:L ).
 

Verjigorm

Top Contributor
Quaxli hat gesagt.:
Und zu dem was Du vorhast wäre es interessant, was Du eigentlich willst. Wenn das periodisch durchgeführt werden soll, wäre es vermutlich sinnvoll, das nur einmal zu machen: Nämlich indem Du ein BufferedImage mit geeignerter Größe erzeugst, Dein Bilder das reinmalst und danach nur noch das BufferedImage zeichnest.

Danke für den Tipp, ich habs jetzt mal wie folgt realisiert:
Code:
	  public void update(Graphics g) 
	  {
		  imageBuffer = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB);
		  graphicsBuffer = imageBuffer.createGraphics();
		  int width = img.getWidth();
		  //System.out.println(width + " " + getWidth() + " " + getHeight());
		  while(width < getWidth()-25)
		  {
			  graphicsBuffer.drawImage(img , 25 + width - img.getWidth(), (getHeight()-img.getHeight())/2, null);
			  width += img.getWidth();
		  }
		  graphicsBuffer.setColor(Color.RED);
		  graphicsBuffer.drawString("Test", 50, 50);
		  g.drawImage(imageBuffer, 0, 0, this);
	  }
	  
	  public void paintComponent(Graphics g) 
	  {
		  super.paintComponent(g);
		  update(g);
	  }

wäre das besser?
 

byte

Top Contributor
Sehe nicht, was daran besser sein soll. Sehe auch nicht was dagegenspricht, es einfach in der paintComponent() zu lassen.
Solang sich der Code nur aufs eigentliche zeichnen bezieht (kein Business Code, keine Manipulation des Datenmodells), dann kann der ruhig in die paintComponent. Erst wenn der Zeichencode vom Umfang sehr mächtig wird, würde ich mir überlegen, wie man den sinnvoll kapseln kann.
 

Quaxli

Top Contributor
In die update-Methode würde ich's nicht packen.

Außerdem erzeugst Du dort das Image ja auch bei jedem Schleifendurchlauf. Die Idee ist aber das Image vorher zur erzeugen und dann in der Verarbeitungsschleife das fertige Image nur zu zeichnen. Mit der Lösung oben hast Du keine Performance gewonnen.
 

Verjigorm

Top Contributor
Quaxli hat gesagt.:
In die update-Methode würde ich's nicht packen.

Außerdem erzeugst Du dort das Image ja auch bei jedem Schleifendurchlauf. Die Idee ist aber das Image vorher zur erzeugen und dann in der Verarbeitungsschleife das fertige Image nur zu zeichnen. Mit der Lösung oben hast Du keine Performance gewonnen.

Jo, das habe ich auchschon gemerkt,
aber das Problem ist, dass ich vorher noch keiner Angabe über die Panel-Größe habe, da ist getWidth() und getHeight)= = 0.
Ich habe keine Möglichkeit gefunden, die Werte des BufferedImage später noch zu verändern.
 

Marco13

Top Contributor
Brauchst du auch nicht. Du kannst ein neues BufferedImage anlegen, wenn die Größe sich geändert hat (das passiert ja nicht so oft...)

Code:
class Foo
{
    BufferedImage imageBuffer = null;

    private void updateImage()
    {
        if (imageBuffer == null || imageBuffer.getWidth() != this.getWidth() || imageBuffer.getHeight() != this.getHeight())
        {
             imageBuffer = new BufferedImage(this.getWidth(), this.getHeight(), ...);
        }
        // Hier ist imageBuffer immer gültig und hat die richtige größe...
}



BTW: Ich würde das auch nicht in der update-Methode machen....
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Logik auf GUI übertragen AWT, Swing, JavaFX & SWT 2
P Swing GUI noch nicht gezeichnet - Logik läuft - blockiert AWT, Swing, JavaFX & SWT 3
N MVC - Logik zum Verändern der View AWT, Swing, JavaFX & SWT 8
E SWT und Separierung von Logik, Präsentation sowie Modell (also eine Form von MVC) AWT, Swing, JavaFX & SWT 10
O Zugriff auf PreferenceStore aus der Business-Logik-Schicht? AWT, Swing, JavaFX & SWT 11
F Zugriff auf Oberfläche bzw Trennung GUI / Logik AWT, Swing, JavaFX & SWT 3
K Trennung von GUI und Logik AWT, Swing, JavaFX & SWT 6
G Korrekte Trennung von GUI, Logik und Event nach MVC AWT, Swing, JavaFX & SWT 5
O Trennung Gui und Logik - Strukturierte Client Anwendung AWT, Swing, JavaFX & SWT 4
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
B 2D-Grafik paintComponent für rechteckigen Bereich? AWT, Swing, JavaFX & SWT 6
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
N paintComponent für Graphics ansprechen AWT, Swing, JavaFX & SWT 2
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
JFeel-x repaint für Aufruf von paintComponent-Klasse ungeeignet? AWT, Swing, JavaFX & SWT 11
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
T paintComponent() überschreiben: Platz für Border freihalten? 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
hdi super.paintComponent(g); soll nicht alles löschen AWT, Swing, JavaFX & SWT 2
G paintComponent() Methode für JPanel in NetBeans überschreibe 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

Ähnliche Java Themen


Oben