SWT-GUI von aussen füllen (Multi Threaded)

  • Themenstarter Themenstarter DaRolla
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
D

DaRolla

Gast
hallo,

ich habe vor kurzem erst mit SWT angefangen.

Ich habe ein grundlegendes Problem.

Hoffentlich kann mir hier jemand helfen.

Also:

ich habe eine SWT Klasse die Composit erweitert und ein paar Labels und ein Textfeld zeichnet.

ich habe eine Thread Klasse die Thread erweitert und die die SWT Klasse in der run-Methode startet und diese Schleife laufen lässt.

while( !shell.isDisposed() ) {
if( !display.readAndDispatch() )
display.sleep();
}

nun will ich in einer Testklasse die Thread Klasse starten.

Aber ich habe keine Kontrolle mehr über die Labels, die ich gerne beschreiben möchte.

Der Fehler:

Exception in thread "main" org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:2691)
at org.eclipse.swt.SWT.error(SWT.java:2616)
at org.eclipse.swt.SWT.error(SWT.java:2587)
at org.eclipse.swt.widgets.Widget.error(Widget.java:381)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:284)
at org.eclipse.swt.widgets.Control.redraw(Control.java:1412)
at de.schmitz.apps.earthdawn.ArenaGui.main(ArenaGui.java:47)

Dabei rufe ich doch nur die redraw Methode auf. Auch wenn ich setText auf ein Label (welches ich per Getter durchreiche) ausführe bekomm ich diesen Fehler.

Normalerweise sollte das klappen.

Das Problem ist dass ich keine Listener einsetzen möchte, weil die GUI nur zum Anzeigen der Inhalte da ist, die ich NICHT IN DEr GUI generieren möchte sondern extern.


Liebe grüße
Marco
 
Sorry, hab grad nicht viel Zeit. Habe SWT bisher nur direkt für Eclipse-Plugins und RichClients verwendet. Aber da muss man GUI-Sachen auch als synchronThreads ausführen. Such mal nach "Display.syncExec".

Gruß,
Knoxx
 
Hey Knoxx,

vielen Dank für den Tipp. :toll:

Also das ganze geht so:

Wir haben den VIEW, also die Gui Klasse. Da darf ruhig das main drin sein (wie es manche Gui Builder sowieso schon erzeugen), und hier starten wir auch die Gui.

Der Trick ist dass wir ASYNCHRON das CONTROL als Runnable starten. :lol:

Also die Spitze vom Eisberg ist diesmal die Gui, und von hier aus werden andere Threads wiefolgt aufgerufen:


Hier die Gui Klasse:

Code:
public class SwtGui extends org.eclipse.swt.widgets.Composite {

    // Variabeln

    // Konstruktor

    // Getter und Setter, z.B. setMyTxt( String );

    // main()
    public static void main( String[] args ) {
		
        Display display = Display.getDefault();		
        Shell shell = new Shell( display );
        SwtGui inst = new SwtGui( shell, SWT.NULL );           // hier erzeugen wir eine Instanz von uns selber
        ...
        display.asyncExec( new SwtGuiThread( inst ) );         // hier wird meine Threadklasse erzeugt und gestartet
        shell.open();
        while( !shell.isDisposed() ) {                         // die Messaging Loop
            if( !display.readAndDispatch() )
                display.sleep();
        }
}//class

Hier noch die Thread Klasse, die übrigens KEIN start() im Konstruktor hat, das macht asyncExec() schon selber:

Code:
public class SwtGuiThread extends Thread {	

    // Variabeln
    private SwtGui gui = null;
	
    // Konstruktor
    public SwtGuiThread( SwtGui gui ) {                       // hier Referenz auf Gui speichern	
        this.gui = gui;
    }

    public void run() {       
        gui.setMyTxt( "juchu" );                               // über Setter direkt in die Gui schreiben
    }	
}//class
Jedenfalls noch mal vielen Dank & Liebe Grüße

DaRolla
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben