[SWT] Sash (Widget) .redraw() direkt erzwingen?

durchgedreht

Grünschnabel
Hallo,
habe Probleme mit einem Widget (Sash). Dieses dient mir als Trenner zweier Tree-Ansichten links und rechts, welche ich mit linien verbinden will. Die linien kann ich zeichen. Allerdings habe ich Probleme, wenn sich diese Linien Ämndern. Die ric htigen Listener habe ich schon eingehängt, und diese werden auch nur dann aktiviert, wenn sie es sollen - daran liegt es nicht!
ABER:
Wenn ich den Lister Aufrufe und ich nur die Linien zeichne ist alles ok, aber die Linien werden halt dann immer mehr und übereinandergezeichnet. Wenn ich redraw() aufrufe, werden anscheined erst die Linien gezeichnet und danach(!) ein repaint ausgeführt, so daß ich ein leeres Sash erhalte.

Wie kann ich ERST das redraw() ausführen und DANACH die Linien zeichnen. In der Javadoc steht was von "mark for redraw()", aber ich muß das ja auch irgendwie erzwingen können.

THX!

Code:
	private void renderLinks(final Sash sash, int orientation){
//		sash.getDisplay().asyncExec(
//			new Runnable() {
//				public void run(){
//					sash.redraw();
//				}
//			}
//		);
//	
		sash.redraw();
		CurvePainter cp = new CurvePainter();
                   ...
                   hier werden jetzt per CurvePainter und GC die Linien gezeichnet
                   ....
 
Ich nehme mal an dass in dem bisschen Code welches du gepostet hast nicht die wirklich relevanten Teile stehen.

Welchen GC benutzt du zum Zeichnen? Den den du vom Event bekommst oder einen eigenen? Für gewöhnlich sollte es nicht passieren dass alte Linien noch zu sehen sind wenn man den Event GC benutzt. Kann aber auch falsch liegen, eine weile nichts mehr mit SWT gemacht.

Wäre auf jeden Fall interessant zu sehen von wo RenderLinks aufgerufen wird und womit und worauf du dann zeichnest. Und den Code am Besten in [code=java]...[/code] einschliessen, dann kann man ihn auch gut hier lesen.
 
Hallo Zeja,

Du hast ganz richtig vermutet. Es lag am GC. Da ich neu bei SWT bin und sonst eigentlich nicht so der GUI - Entwickler bn habe ich das ganze falsch angepackt. Ich habe mit einem neuen GC gemalt, welches ich mittels Listener direkt durch meine render() Methode zeichen wollte.

Jetzt habe ich es umgestellt. Das Sash wird selbst durch die redraw() Methode neu gezeichnet. Die Linien zeichne ich durch einen PaintListener, der beim Event den GC des Sash mitliefert. Diesert wird dann also auch zum zeichnen verwendet. Wenn ich das Sash bei einer anderen Aktion neu zeichnen will, stoße ich das jetzt nur noch durch sash.redraw() von außen an, wodurch dann natürlich auch mein neuer PaintListener aufgerufen wird und damit die Linien neu zeichnet.
Wenn noch jemand neu bei SWT ist: Man muß jedes Mal alle Linien komplett neu zeichnen, das GC merk sich nicht, was darauf gezeichnet wurde
Eine gute Erklärung zu GC habe ich hier gefunden:
http://www.eclipse.org/articles/Article-SWT-graphics/SWT_graphics.html

Trotzdem vielen Dank, spätestens mit Deinem Tip hätte ich das Problem gelöst, e sging genau in die Richtige Richtung. Danke auch für das Java - Tip (leider finde ich die Forum Buttons eh nicht so aussagekräftig, aber na ja, haupotsache es gibt ein solches Forum ;-)
 

Neue Beiträge

Zurück