# [Eclipse RCP] Von woanders View updaten



## Saxony (6. Aug 2009)

Hiho,

ich habe eine View mit einem Label. In einer anderen Klasse, welche bspw. am COM Port lauscht möchte ich nun den Inhalt dieses Labels ändern.

1. Wie finde ich die View wo das Label geändert werden muss?
2. Wie ändere ich den Inhalt dieses Labels?

bye Saxony


----------



## Koringar (6. Aug 2009)

Hi,

diese andere Klasse die auf den Com- Port hört, ist das ein Thread oder Job?


----------



## Saxony (6. Aug 2009)

Das ist ein Thread. Aber das war nur ein Beispiel. Ich meine generell von "Irgendwo" aus will ich auf die View zugreifen und dort den Text eines Labels ändern. Das "Irgendwo" ist aber schon im selben Plug-In. 

bye Saxony


----------



## Marco13 (6. Aug 2009)

???:L Ganz klasssich doch indem das Ding, das sich ändert, einen Event wirft, und die view als Listener auf das Dinge registriert ist?! ???:L


----------



## Koringar (6. Aug 2009)

Die einfachste Methode von einem Thread aus ist, diese Label oder gleich die ganze View mit zu übergeben. Und dann in dem Thread auf die Methode zum setzen des Text etc. zugreifen.

Jedoch muss das mit einer Syncronation machen:

```
tblMonitor.getDisplay().asyncExec(new Runnable() {
			public void run() {
				if (!tblMonitor.isDisposed()) {
					//das was du ändern willst
				}
			}
		});
```
 oder .syncExec, jenach dem ob die View in dem Moment darauf warten soll oder nicht.

Ich würde dir aber bei Threads die Jobs Api sehr ans Herz legen, dieser kannste einem Listener übergeben und dann machste alle Änderungen nur in der View (ist sauberer).
Die Job sind im Grunde auch nur Threads, blos erweitert.

Edit:

Oder wie Marco13 es sagte, dem Thread oder Klasse einem Listener verpassen.


----------



## Saxony (6. Aug 2009)

Marco13 hat gesagt.:


> ???:L Ganz klasssich doch indem das Ding, das sich ändert, einen Event wirft, und die view als Listener auf das Dinge registriert ist?! ???:L



Na ok so hab ichs ja schon mal versucht zu bauen.


```
public interface IMyListener {

	public void update();
}
```


```
//Klasse wo sich was ändert

public void setMyListener(IMyListener aListener) {
		
	this.myListener = aListener;
}

// irgendwo weiter in der Klasse
...
this.myListener.update();
...
```

Und meine View implementiert IMyListener und setzt sich auch als Listener mittels public void setMyListener(IMyListener aListener) in der Klasse wo sich was ändert.

In der von IMyListener implmentierten update() meines Views steht folgendes:


```
public void update() {
		
	this.myText.setText("asd");		
}
```

Das führt aber zu:


```
Exception in thread "AWT-EventQueue-0" org.eclipse.swt.SWTException: Invalid thread access
	at org.eclipse.swt.SWT.error(SWT.java:3884)
	at org.eclipse.swt.SWT.error(SWT.java:3799)
	at org.eclipse.swt.SWT.error(SWT.java:3770)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
	at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
	at org.eclipse.swt.widgets.Text.setText(Text.java:1950)
```

Also muss ich da bestimmt was mit dem asyncExec machen aber wo und wie ist die Frage!?

Beziehungsweise müsste ich an das ominöse Display rankommen, damit die update Methode im UI Thread laufen kann!

bye Saxony


----------



## Marco13 (6. Aug 2009)

(Sorry, so als Nachtrag: Ich hatte (mal wieder) übersehen, dass es hier NICHT um Swing geht... vielleicht sollte man den Forenteil bei der übersicht der "neuen Beiträge" etwas prägnanter darstellen  )


----------



## Saxony (6. Aug 2009)

LoL - hat sich er ledigt!


```
//Klasse wo sich was ändert

public void setMyListener(IMyListener aListener) {
		
	this.myListener = aListener;
}

// irgendwo weiter in der Klasse
...

Display.getDefault().asyncExec(new Runnable() {
	public void run() {

		this.myListener.update();
	}
});
...
```



Ist Display.getDefault() oder Display.getCurrent() das richtige ?

bye Saxony


----------



## Saxony (6. Aug 2009)

Marco13 hat gesagt.:


> (Sorry, so als Nachtrag: Ich hatte (mal wieder) übersehen, dass es hier NICHT um Swing geht... vielleicht sollte man den Forenteil bei der übersicht der "neuen Beiträge" etwas prägnanter darstellen  )



Hmm - wie kommst ud von View auf SWING? Aso wegen MVC bestimmt. Ich pass mal den Titel an.


----------



## Saxony (6. Aug 2009)

Saxony hat gesagt.:


> LoL - hat sich er ledigt!
> 
> 
> ```
> ...



So zwei Fragen hab ich noch:

1. Ist Display.getDefault() oder Display.getCurrent() das richtige ?

2. Wie erkenne ich ob mein View nicht disposed ist? Weil wenn der geschlossen ist gibts ne disposed exception.

bye Saxony


----------



## Koringar (6. Aug 2009)

Saxony hat gesagt.:


> LoL - hat sich er ledigt!
> 
> 
> ```
> ...



Naja, ich würde das erstens nicht in der Klasse machen mit dem async oder sync, sonder in der Methode update selber

```
public void update() {
	myText.getDisplay.asyncExec{
                 public void run() {
// Würde noch empfehlen immer vorher zu prüfen ob es das Label noch gibt. Sonst
// kommt irgend wann die nächste Exception
                        if(!myText.isDisposed())
	                       this.myText.setText("asd");
                 }
        }		
}
```

Und das Display würde ich mir immer von der Komponente geben lassen, was du ändert willst. In deinem Fall eben das Label.


----------



## Saxony (6. Aug 2009)

Ah ok - so klappts nun.

Danke!


----------

