# repaint bei JPanel erzwingen



## Nicole81 (23. Jun 2007)

Hallo,

ich hatte ursprünglich eine Klasse von Canvas abgeleitet, auf das ich kurven usw zeichnen konnte. Dazu hatte ich die paint Methode überschrieben. Weiterhin kann ich eine Animation anstarten, wobei das Canvas alle 20ms neugezeichnet wird, also repaint() in einem Timer (Timer ist im Canvas) aufgerufen wird.

Jetzt hab ich Scrollbars benötigt und dachte ich leite meine Klasse nicht von Canvas ab, sondern von JPanel und dieses setze ich auf ein Scrollpane. Sollte ja kompatibel sein dachte ich. Funktioniert auch alles, nur ein Panel scheint so schlau zu sein, ein neuzeichnen nur auszuführen, wenn es sichtbar ist. Das Ding soll sich aber unbedingt neuzeichnen auch wenn es versteckt (iconified oder invisible) ist.

Wie könnte man das machen?

Habe schon validate, revalidate, invalidate, updateUI... aufgerufen, nichts tut sich :-(

das hab ich auch schon eingebaut, ka ob das nötig ist:

```
public void paintComponent(Graphics g) 
	{ 
		super.paintComponent(g); 
		paint(g);
	}
```

Hab auch schon von der Scrollpaine repaint(), invalidate, validate aufgerufen, tut sich auch nichts.

Gruß


----------



## Der Müde Joe (23. Jun 2007)

Nicole81 hat gesagt.:
			
		

> Funktioniert auch alles, nur ein Panel scheint so schlau zu sein, ein neuzeichnen nur auszuführen, wenn es sichtbar ist. Das Ding soll sich aber unbedingt neuzeichnen auch wenn es versteckt (iconified oder invisible) ist.



Wieso? Ein Neuzeichenen macht nur Sinn, wenn man es auch sieht. Warum soll ein verstecktes JPanel sich selber neu malen, wenn es doch nicht sichtbar ist?


----------



## Nicole81 (23. Jun 2007)

Weil ich es eben benötige 

Da läuft eine Animation ab, die ich in einem Preview Fesnter verkleinert anzeigen möchte. Und in der Paint Methode erstellt er mir ein Inage welches ich dafür nutze. Also kein repaint() vom Panel, keine aktualisierung meines Vorschaufensters.


----------



## Der Müde Joe (23. Jun 2007)

Die Daten, welche für das Zeichnen des Originals vorhanden sind, könntest du doch einfach benutzen, um die Preview zu erstellen. Die repaint der Preview erledigt dann alles was sie muss, also die Preview erstellen, während das Original schläft.


----------



## Nicole81 (24. Jun 2007)

Nein das geht leider nicht so einfach, da die Daten des Original auf die eingestellte Pixelgrösse des originals abgestimmt sind.

Ich habe es jetzt mal mit einem direkten aufruf von 


> paint(getGraphics());



versucht, so geht es, allerdings flackert so das Original beim ständigen neuzeichnen während der Animation.

Mache jetzt 

```
if (mainframe.isVisible())
   repaint();
else
   paint(getGraphics());
```

was aber eine total besch... eidene Lösung ist, da die Preview jetzt extrem flackert :-(


----------



## Der Müde Joe (24. Jun 2007)

Nicole81 hat gesagt.:
			
		

> Nein das geht leider nicht so einfach, da die Daten des Original auf die eingestellte Pixelgrösse des originals abgestimmt sind.



Das Image wurde ja auch irgendwie erstellt. Mach doch eine Funktion getPreviewImage() oder so, welche dir aus den Daten des Originals eine Preview erstellt (halt nicht mehr in der paint drin aber wen störts....). Die paintComponent(G g) der Preview ruft wenn sie Previewen will diese Methode auf und erhält die Preview als Image (oder BufferedImage). Somit ist das Original auch nicht mehr verantworlich für die Preview, sondern die Preview macht seine Aufgaben selber.


----------



## Nicole81 (25. Jun 2007)

hm...
ja das ist eine gute Idee, ich versuche es mal so, danke!!


----------

