Multithreaded access auf SWT Componenten. AsyncExec und kein Ende ....

bemar

Mitglied
Tach auch,

ich möchte über einen Fremdthread auf ein Browserfeld in einer SWT Gui zugreifen. Es sollen Nachrichten in dieses Fenster bzw. in den Browserbereich geschrieben werden.
(Browserbereich deshalb, weil ich da so schön mit HTML rumfuchteln kann).

Jetzt frag ich mich gerade, wie es wohl funktioniert nicht nur wie in den ganzen Beispielen eine Progressbar zu aktualisieren, sondern kompletten Text in die GUI zu schieben. Ich frag mich das deshalb, weil es mir noch nicht gelungen ist den Text meines Thread X über das Runnable und die AsyncExec in die GUI zu bekommen, da ich immer die Meldung "Cannot refer to a non-final variable message inside an inner class defined in a different method" wenn ich das Statement "swtWindow.fieldBrowserText.setText(message);" bekomme.

PHP:
private void printMessage (String sender, String message){
		Log.debug("Nachricht von "+sender+": "+message);
		if (isTextChat){
			System.out.println("Nachricht von "+sender+": "+message);
			Log.debug("Nachricht von "+sender+": "+message);
		}
		else{
			if (mChatWindow!=null){
				//mChatWindow.setMessage2ChatWindow(sender, message);
				mChatWindow.getParent().getDisplay().getDefault().
				asyncExec (
						new Runnable () {
							public void run () {
								mChatWindow.fieldChatText.setText(message);
							}
					}
			);
			
			}
			else{
				System.out.println("ERROR!! ChatWindow = null");
				Log.debug("ERROR!! ChatWindow = null");
			}
		}
	}

Danke für eure Tipps

Gruß

Ben
 
Zuletzt bearbeitet:
Krass, kaum postet man ein Problem in ein Forum, kommt man auch schon selbst drauf.

Ich hab die Methode jetzt wie folgt verändert und schon gehts

PHP:
private void printMessage (String sender, String message){
        final String myMessage = message;
        final String mySender = sender;
        Log.debug("Nachricht von "+sender+": "+message);
        if (isTextChat){
            System.out.println("Nachricht von "+sender+": "+message);
            Log.debug("Nachricht von "+sender+": "+message);
        }
        else{
            if (mChatWindow!=null){
                //mChatWindowsetMessage2ChatWindow(mySender, myMessage);
                mChatWindow.getParent().getDisplay().getDefault().
                asyncExec (
                        new Runnable () {
                            public void run () {
                                mChatWindow.fieldChatText.setText(myMessage);
                            }
                    }
            );
            
            }
            else{
                System.out.println("ERROR!! ChatWindow = null");
                Log.debug("ERROR!! ChatWindow = null");
            }
        }
    }

und schon gings. Jetzt frag ich mich natürlich, warum ich hier eine Final Variable benötige?

Gruß

Ben
 
Zuletzt bearbeitet:
Zurück