Swing Zeichnung auf Tab im Hintergrund wird nicht gezeichnet

punkt21

Mitglied
Hallo *,

ich habe folgendes Problem:
Für meine GUI verwende ich SWING. Nun habe ich 2 Tabs, einer auf dem ich eine Atkion ausführe und einen, auf dem nach dieser Aktion gezeichnet werden soll.
Der Code, in dem gezeichnet wird, wird ausgeführt.Beim Debuggen läuft er wie gewollt durch. Jedoch sehe ich, wenn ich auf den Tab wechsel, nicht die neue Zeichnung.
Ich will eine Laufzeit in ein Koordinatensystem einzeichnen. Einfach nur als waagerechten Strich auf einer bestimmte Höhe.

in der paint() methode, lasse ich mir die Graphics abspeichern via:
Java:
public void paint( Graphics g) {
	this.g = g.create();
	g.drawLine( startX, startY, startX, endY);
	g.drawLine( startX, endY, endX, endY);
}

Dann will ich nach dem Ereignis auf Tab 1 eine Zeichnung auf Tab 2 auslösen, was vom Code-Durchlauf her funktionieren müsste.

Java:
private void addGraph( Color c) {
	g.setColor( c);
		
	long highest = getHighestValue();
	g.drawLine(startX, y, endX, y);
		
	g.setColor( Color.BLACK);
}

Kann mir jemand weiterhelfen?

Danke und Gruß
 
Ein paar Anmerkungen:

- in Swing überschreibt man nicht paint, sondern paintComponent
- dabei sollte man nicht vergessen, dies auch für die Vaterklasse aufzurufen (super.paintComponent)
- this.g = g.create() scheint mir ein wenig sinnlos, wenn die Paint-Methode doch ein paint-Objekt übergeben bekommt und zwar in jedem Fall das richtige
- ein Wechsel des Tabs erzeugt vermutlich einen repaint, wodurch Deine Zeichnung verloren geht.

Wie ich vorgehen würde:

Die zu zeichnenden Objekte, die im ersten Tab erzeugt werden, würde ich irgendwie "abspeichern". Entweder in geeignete Objekte, die in einer Collection gesammelt werden und auf die die Zeichenmethode des 2. Tabs zugreift oder man erzeugt ein Image und zeichnet direkt in dieses rein und der 2. Tab zeichnet dann nur noch das Image.
Zweiteres ist aber performancelastiger und wenn Du nur ein paar Linien zeichnen willst, würde ich eher den 1. Weg verfolgen.
 
Danke für deine Antwort.
Ich wusste nicht, dass ich die Methode paintComponent() überschreiben musste. Wahrscheinlich wurde bei mir wohl gezeichnet. Aber Alles wurde würde übermalt, als ich den Reiter wieder in den Vordergrund geholt habe.
Jetzt funktionierts! Danke!
 
Das sinnvollste wäre vielleicht wenn du in der PaintComponent methode soetwas machen würdest:
Java:
if(tabgeändert){
/zeichne dies
}
Und wenn etwas neugezeichnet werden soll, dass flag auf true setzen
 

Zurück
Oben