Image wird nicht (immer) in paintComponent gezeichnet?

Soahc

Aktives Mitglied
Hallo,

ich arbeite gerade an einer Swing-Anwendung für Touchscreens. Hierfür habe ich unter anderem einen JButton erweitert, webei ich die paintComponent Methode überschreibe:

Java:
private Image img;
private String caption;
private Font font;

...

@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2 = (Graphics2D) g;
		if (img!=null){
			g2.drawImage(img, 0, 0, getWidth(), getHeight(), null);
		}else{
			g2.setColor(Color.WHITE);
			g2.fillRect(0, 0, getWidth(), getHeight());
		}
		g2.setFont(font);
		int captionwidth = g2.getFontMetrics().stringWidth(caption);
		g2.setColor(Color.BLACK);
		g2.drawString(caption, getWidth()/2-(captionwidth/2), getHeight()-7);
	}

Falls die Image-Variable nicht null ist, soll das Image auf die gesammte Button-Oberfläche gezeichnet werden. Nun habe ich auf dem ContentPane des ersten JFrames, das angezeigt wird mehrere solcher Buttons hinzugefügt und absolut positioniert und es zeigt sich das merkwürdige Verhalten, dass die Images nicht immer überall sofort gezeichnet werden -> bei manchen Buttons sind sie erst sichtbar, wenn ich mit dem Mauszeiger über den Button fahre, also die Anzeige der Componente refreshed wird. Ich habe nun schon allerhand ausprobiert, aber konnte den Bug bisher nicht beheben. Merkwürdiger weise scheint das Problem auch irgendwie mit der absoluten Position der Buttons auf dem Frame zu tun zu haben. Umso weiter rechts der Button, desto eher wird das Bild anfangs nicht gezeichnet. Auch ein updateUI() des ContentPains verändert nichts.

Hat jemand vielleicht einen Tip, woran das liegen kann?

liebe Grüße, Soahc
 
Wieso benutzt du nicht JButton.setIcon? Dann musst du nichtmal neuen Code schreiben.

Vielleicht hilft ein "repaint()" nachem das Bild gesetzt wurde? Ein "updateUI" initialisiert das LookAndFeel neu... das hilft dir garnichts.
 
wie/wann setzt du das Image? Wenn es über den Setter geschieht, solltest du dort ein repaint-Aufruf haben:
[java=103]
public void setImage(BufferedImage img) {
this.img=img;
repaint();
}
[/code]
 
Wieso benutzt du nicht JButton.setIcon?

Weil ich einen Button haben möchte, der ein ganz eigenes Aussehen hat, auch der Text soll an einer anderen Stelle als der Default-Stelle sein.

wie/wann setzt du das Image?
Das image wird im Konstruktor gesetzt. Ein repaint hilft hier leider nicht weiter, da die Komponente ja noch gar nicht auf dem Panel liegt und somit auch nicht gezeichnet werden kann.
 
@Beni: Eigentlich hast Du doch recht. Ich kann ja das Bild über setIcon einbinden und den Text bei paintComponent so positionieren, wie ich es will.

Danke für den Gedankenanstoß!
 
Ich habe mir eine eigene Ressource-Manager Klasse geschrieben, die bei Programmstart alle Bilder einliest und diese per Hashmap (dateiname als Schlüssel) zur verfügung stellt.
 

Neue Themen


Zurück
Oben