# Frage zur Paint-Methode und zu JFrame



## dapor (20. Januar 2005)

hi,

ich habe selber einen Sokoban Clon geschrieben, der fkt soweit auch schon wunderbar, ABER 
1.) in diesem überschreibe ich selber bei jeder Bewegung die Paint Methode (habe gehört das soll nicht so gut sein ...) Klick zum Code, wie er bis jetzt gemacht wurde
das hat auch den nachteil das er immer ALLES neumalt ... geht es nicht auch, dass er immer nur die Spielfigur und die Kisten selber neu malt, weil der Rest verändert sich ja nicht. Also gibt es da eine andere Methode in der ich einzelne Sachen immer nur neu zeichne?



2.) Dann wollte ich weg vom Applet hin zum JFrame! Code für das JFrame 
Hab mir gedacht mit ner JMenuBar sieht das auch viel besser aus und ist einfacher und besser zu bedienen! Ich kann jetzt zwar den Hintergrund einfügen, aber wie schaffe ich das jetzt, mein eigentliches Level zu zeichnen und zwar nur auf dem Hintergrund (also in meinem Bsp auf dem BackgroundPanel). Click zum BildBeispiel 
Also ich möchte gerne wissen, kann ich ohne die Paint Methode zu überschreiben, es hinbekommen, dass er das SpielFeld aufmalt und dann auch nur das neu malt, was sich verändert (wenn sich z.b. die Spielfigur bewegt)! 

ich hoffe ihr habt mich halbwegs verstanden und jemand hat lust und zeit mir zu helfen!
ich danke schonmal im vorraus!


----------



## torsch2711 (20. Januar 2005)

Hmmm,

also es gibt glaube ich (ich lass mich gerne korrigieren) die möglichkeit, nur teile eines fenster neu zu zeichnen. du spezifizierst dann eine region und lässt nur diese neu zeichnen, allerdings muss ich da passen, was du da aufrufen musst. Prinzipiell geht das, das weiss ich , aber so spontan nicht wie.

Schonmal beim Swing tutorial nachgeschaut?

Gruss

Torsten.


----------



## javaprogger1987 (20. Januar 2005)

Erstmal ne Frage: Wieso willst du nicht die paint-Methode überschreiben
Wenn du außerhalb der paint-Methode zeichnen willst kannst du das mit this.getGraphics().draw... machen. Wenn du nicht willst, das der alles neu zeichnet lass die update-Methode einfach leer. Den Hintergrund sollte der aufgrund der paintCompnent Methode sowieso neu zeichnen oder Falls du nur das neu zeichnen willst was sich geändert hat musst du das dann halt feststellen, und den Bereich dann übermalen..


----------



## dapor (20. Januar 2005)

Danke, erstmal der this.getGraphics().draw... Befehl ist schon praktisch!

Aber verstehe ich das jetzt richtig?
Also ich habe jetzt das BackgroundPanel und möchte jetzt nur noch darauf zeichnen!
Die Sache ist die, wenn ich das Hintergrundbild jetzt in ein JSrcollPane packe, dann schaffe ich es ja schon die richtigen MausKoordinaten herauszufinden, wohin man klickt, aber wie kann ich jetzt nur dort die Paint-Methode überschreiben (und zwar nur für das Bild in der JScrollPane)?

Die andere Sache, warum es mich stört die Paint-Methode im JFrame zu überschreiben, ist folgende: da mein Programm Bilder benutzt, setzte ich das Layout auf null und packe alles wirklich dahin, wo ich es hinhaben möchte! Halt von Hand mit setLocation usw
wenn ich jetzt aber noch ein JMenuBar habe und das Hintergrundbild an die Stelle 0,0 packen möchte, dann ist beginnt das Bild unter der Leiste, wo der Name des JFrames steht und ausserdem sieht man eingefügte JButtons erst, nachdem man sie einmal angeklickt hatte (verstehe beide Sachen nicht so richtig warum das so ist)!


----------



## javaprogger1987 (21. Januar 2005)

Danke, erstmal der this.getGraphics().draw... Befehl ist schon praktisch!




> Aber verstehe ich das jetzt richtig?
> Also ich habe jetzt das BackgroundPanel und möchte jetzt nur noch darauf zeichnen!
> Die Sache ist die, wenn ich das Hintergrundbild jetzt in ein JSrcollPane packe, dann schaffe ich es ja schon die richtigen MausKoordinaten herauszufinden, wohin man klickt, aber wie kann ich jetzt nur dort die Paint-Methode überschreiben (und zwar nur für das Bild in der JScrollPane)?


 
Also das versteh ich ehrlich gesagt nicht . Was willst wissen?



> Die andere Sache, warum es mich stört die Paint-Methode im JFrame zu überschreiben, ist folgende: da mein Programm Bilder benutzt, setzte ich das Layout auf null und packe alles wirklich dahin, wo ich es hinhaben möchte! Halt von Hand mit setLocation usw
> wenn ich jetzt aber noch ein JMenuBar habe und das Hintergrundbild an die Stelle 0,0 packen möchte, dann ist beginnt das Bild unter der Leiste, wo der Name des JFrames steht und ausserdem sieht man eingefügte JButtons erst, nachdem man sie einmal angeklickt hatte (verstehe beide Sachen nicht so richtig warum das so ist)!


 
Ja diese Probleme kenne ich teilweise. Die Koordinate 0,0 ist da wo das Fenster anfängt, also zählt die TitleBar noch mit. Das kannst du umgehen, indem du den Bereich abfragst den du bemalen kannst.Das kannst du mit this.getInsets() abfragen. Der Wert this.getInsets().top gibt dann z.B. an ab welcher y-Koord. du anfangen kannst zu zeichnen (Wobei du beachten musst, dass du noch die Höhe der JMenuBar addierst).
Warum das mit den Buttons so ist weiß ich auch nicht, aber ich lös das immer so:


```
public void paint(Graphics g) {
	button1.updateUI();
	button2.updateUI();
	//Usw.
}
```
 
Was ich auch noch anders mache, ist das ich das (Hintergrund-)Bild eigentlich nie als eigene Klasse mache, sondern in der paint-Methode zeichnen lass (wobei ich trotzdem das null-Layout nehme, da hat man mehr Kontrolle).


----------



## dapor (21. Januar 2005)

Also das versteh ich ehrlich gesagt nicht . Was willst wissen?

Ganz "einfach"! Ich habe ein Bild in ein JScrollPane gepackt und möchte jetzt auch nur in diesem Bereich zeichnen. Also kurzes Beispiel. Mein Bild ist 2000x2000 Pixel gross und soll nur 500x500 dargestellt werden. Der Rest ist halt über die JScrollPane erreichbar.
Ich sehe jetzt also nur die Pixel 0 - 500 und 0 - 500, möchte jetzt aber was auf den Pixel 1000x1000 malen -> sehen tu ich es erstmal nicht, aber wenn ich dann scrolle, würde ich halt gerne, dass wenn ich in diesem Bereich bin, auch das Bild sehe!

Und ausserdem habe ich mich gefragt, wie man in einem JFrame mehrere andere Unterkomponenten haben kann und diese einzeln neu zeichnen kann! Dann hätte ich auch das Problem mit den Buttons und der Paint Methode nicht mehr, weil ich ja nur den Teil vom Bild erneuere, der sich verändert!

der Befehl 	button1.updateUI(); fkt zwar, führt aber dazu das bei jedem neuen zeichnen der Teil flackert den ich damit aufrufe! Also meine JMenuBar sehe ich jetzt zwar, ABER sie flackert total! Deshalb möchte ich in mein Haupt-JFrame keine Paint Methode schreiben, sondern einfach nur die einzelnen Teile sich erneuern lassen!
Also was ich frage ist: Gibt es eine Möglichkeit (bildlich gesprichen) mehrere JFrames in einem JFrame?


----------



## javaprogger1987 (23. Januar 2005)

Also das mit dem JScrollPane weiß ich nicht, aber das:



> Und ausserdem habe ich mich gefragt, wie man in einem JFrame mehrere andere Unterkomponenten haben kann und diese einzeln neu zeichnen kann! Dann hätte ich auch das Problem mit den Buttons und der Paint Methode nicht mehr, weil ich ja nur den Teil vom Bild erneuere, der sich verändert!
> 
> Gibt es eine Möglichkeit (bildlich gesprichen) mehrere JFrames in einem JFrame


 
Das könntest du mit einem JPanel lösen. Das ist eine Zusammenfassung von mehreren Komponenten.


----------



## dapor (31. Januar 2005)

Jo, thx habe zwar noch einige probleme aber die kann ich alleine lösen
erstma thx für deine hilfe
jetzt habe ich nur noch eine letzte frage (hoffe ich jedenfalls):
möchte wenn ich auf einen menupunkt gehe das er eine html datei öffnet und probiere dies mit 


```
try {
          Runtime.getRuntime().exec(System.getProperty("user.dir")+"/Hilfe/GameHilfe.html");                        
          } catch (IOException ex) {
                System.out.println(ex);
          }
```

Aber bekomme leider eine exception obwohl die datei genau da ist wo ich sie angebe ...
denke ich falsch?
java.io.IOException: CreateProcess: E:\Sun\Editor\bin/Hilfe/GameHilfe.html error=193
<- dieser fehler kommt ...
thx for help


----------



## javaprogger1987 (1. Februar 2005)

```
try {
		 Runtime.getRuntime().exec(System.getProperty("user.dir") +"\\Hilfe\\GameHilfe.html");						
		 } catch (IOException ex) {
				System.out.println(ex);
		 }
```
Könnte sein das es so funktioniert...
Aber ich glaube das gibt auch einen Fehler, weil das keine ausführbare Datei ist.
Ich habs bei mir (unter Windows) immer so gelöst:


```
try {
		 Runtime.getRuntime().exec("explorer " + System.getProperty("user.dir") +"\\Hilfe\\GameHilfe.html");						
		 } catch (IOException ex) {
				System.out.println(ex);
		 }
```


----------

