Zeichnen in einem JFrame nach Resize

w!ckeD

Mitglied
Hey Leute,

ich programmiere derzeit an einem Spiel, welches ich in diesem Semester im Rahmen eines Uniprojekts mache. Die GUI läuft in einem JFrame, wobei meine selbst geschriebene GUI-Klasse den JFrame extendet. Derzeit wird noch alles ausnahmslos über die drawRect- und drawString-Methode gezeichnet (Grafiken kommen evtl. später). Ich zeichne dabei, im ein Flimmern auf dem Bildschirm zu vermeiden, erst alles auf ein BufferedImage, welches ich dann auf ein JPanel auf dem JFrame zeichne. Dabei bin ich auf folgendes Problem gestoßen:
Wenn ich den JFrame verkleinere, arbeitet meine resize-Methode ohne Probleme und die Spielansicht wird entsprechend der JFramegröße passend kleiner hineingezeichnet (ich mache das über ein AffineTransform-Objekt und ne Menge Rumgerechne...)
Ziehe ich den JFrame jedoch größer, als er anfangs war, wird zwar alles passend skaliert, jedoch wird die Spielansicht nur bis dahin gezeichnet, wo die Grenzen des Frames bei Programmstart waren, der Rest des JFrames bleibt weiß.
Ich passe bei jedem Resize die Größe des JPanels an und erstelle ein neues BufferedImage, welches die Größe des JPanels erhält. Mir ist wirklich schleierhaft, wieso nicht auf dem kompletten Fenster gezeichnet wird...
Ich hoffe, ich habe alles verständlich beschrieben, ansonsten lege ich dahingehend natürlich gerne noch nach 😉

besten Gruß,
w!ckeD
 
Hey und erst Mal danke, dass sich jemand überhaupt erst Mal den Thread so zeitig angesehen hat. Nachdem ich meinen Code umstrukturiert hab und das JPanel nun jedes Mal neu erstelle, klappt das Ganze. Ich scheine da irgendwelche Abhängigkeiten nicht gesehen zu haben.
Code hätte ich auch sofort dabeigepackt, aber der relevante Code ist recht verstreut über die Klasse und auch nicht sehr leserlich, deswegen wollte ich es so probieren. Vielleicht gibt's ja generelle Dinge, die ich nicht beachtet habe.

besten Gruß,
w!ckeD
 
Naja ohne Code hier mal die Klassiker.

- die paint(); - Methode wurde verwendet, dann lieber die paintComponent(); überschreiben
- es wurde irgendwo mit getGraphics(); gearbeitet, (uuuuuuuuunbedingt vermeiden)
- der Gameloop bekommt deine Größenänderung nicht richtig mit (ein paar sysout sollten Aufschluß geben)
- da das Erstellen eines neuen JPanels (*autsch*) ja Abhilfe schafft, versuche mal ein reValidate();


das sind so die Eckpunkte, die mir erstmal einfallen.

Gruß Vanny
 
Okay jetzt mal aus reiner Neugierde: Warum leiber mit der paintComponent arbeiten? Und mit getGraphics() hab ich bis jetzt gut und zuverlässig gearbeitet, ich hab aber öfter gelsesen, dass man es nicht verwenden soll - warum?
Eigentlich gibt es keinen Gameloop, das das Ganze im MVC-Pattern mit Observer-Pattern realisiert ist, die GUI kriegt mit, wenn sie sich neu zeichnen soll und kann das außerdem maximal ein Mal pro Taktschlag tun.
Danke für dien Feedback!

besten Gruß,
w!ckeD
 
Okay jetzt mal aus reiner Neugierde: Warum leiber mit der paintComponent arbeiten?...

[DUKE]public void paint(Graphics g)
Invoked by Swing to draw components. Applications should not invoke paint directly, but should instead use the repaint method to schedule the component for redrawing.
This method actually delegates the work of painting to three protected methods: paintComponent, paintBorder, and paintChildren. They're called in the order listed to ensure that children appear on top of component itself. Generally speaking, the component and its children should not paint in the insets area allocated to the border. Subclasses can just override this method, as always. A subclass that just wants to specialize the UI (look and feel) delegate's paint method should just override paintComponent.[/DUKE]
 
Aha, wieder was dazu gelernt. Ich muss gestehen, dass ich mir die Java API nicht so serienmäßig zu Gemüte führe. Vielen Dank für die Antwort 😉
 
Ich bin auch kein API-Wurm xD.
Wenn ich aber 5 mal lese: "tu dies an Stelle von dem da", dann schau ich schon mal fix gezielt da rein😉

Gruß Vanny
 

Zurück
Oben