# Frage zu Eclipse Plugin



## Guest (4. Jan 2007)

Hi!

Ich versuche grad mein erstes Eclipse Plugin zu schreiben. Es soll einfach die aktuelle Zeit angeben. Bisher habe ich folgendes:

package com.example.helloworld.views;


```
import java.util.Date;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;


   public class HelloWorldView extends ViewPart {
      static Label label;

      public HelloWorldView() {
      }

      public void createPartControl(Composite parent) {
         label = new Label(parent, SWT.WRAP);
         label.setText("Es ist jetzt: " + new Date().toLocaleString());
      }

      public void setFocus() {
      }

   }
```

Ich brauche jetzt noch einen Thread, der die Zeit die im Label angezeigt wird immer aktualisiert. Meine bisherigen Versuche sind aber alle gescheitert, ich habe immer eine Fehlermeldung bekommen von wegen illegaler Threadzugriff. Wie krieg ich immer die aktuelle zeit ins Label?

Grüsse, Chris


----------



## WieselAc (4. Jan 2007)

am einfachsten startest du intern einen neuen thread, der deje sekunde das datum/ den label text neu setzt und dan einen repaint aufruft.

edit:

probier mal folgendes aus (ist alles dings ungetestet und aus dem Bauch heraus)


```
import java.util.Date;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.part.ViewPart;


   public class HelloWorldView extends ViewPart  implements Runnable {
      static Label label;

      public HelloWorldView() {
      }

      public void createPartControl(Composite parent) {
         label = new Label(parent, SWT.WRAP);
         label.setText("Es ist jetzt: " + new Date().toLocaleString());
         new Thread(this).start();
      }

	public void run() {
		while (true) {
			try {
				Thread.sleep(1000);
			} catch (Exception e) {
			}

                        label.setText("Es ist jetzt: " + new Date().toLocaleString());

			repaint();
		}
	}

      public void setFocus() {
      }

   }
```


----------



## byte (4. Jan 2007)

Du kannst in SWT nicht ohne weiteres von einem nebenläufigen Thread die Widgets verändern. Du musst das z.b. über Display.asyncExec() machen, sonst fliegt eine Exception:



```
Display.asyncExec(new Runnable() {
  public void run() {
    label.setText("Es ist jetzt: " + new Date().toLocaleString());
  }
});
```


edit - @WieselAc: Genau so geht das eben in SWT bzw. RCP nicht. Und auch in Swing sollte man das so nicht machen, weil viele Komponenten nicht thread-safe sind.


----------



## WieselAc (4. Jan 2007)

Ups dann hab ich wieder was über SWT gelernt und zieh ich meine Aussag zurück. 


Das die Vorgehensweise auch in Swing nicht gerade die Beste ist, war mir bewusst, aber so auf die schnelle und für den Hausgebrauch tipp ich leider doch häufig so. 


*Notiz an mich: Sauberer proggen*


----------



## byte (4. Jan 2007)

Aus dem Grund fliegt in SWT auch grundsätzlich eine Exception. Da wird Faulheit bestraft.


----------



## Guest (4. Jan 2007)

Hi!

Danke!! Das aktualisieren funktioniert jetzt wunderbar! 

Nur ein problem habe ich noch: wenn ich Eclipse beende, friert es komplett ein und ich kanns nur noch "abschießen". Ist bei dem thread noch was falsch?


```
import java.util.Date; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Label; 
import org.eclipse.ui.part.ViewPart; 

   public class HelloWorldView extends ViewPart  { 
      static Label label; 

      public HelloWorldView() { 
      } 

      public void createPartControl(Composite parent) { 
         label = new Label(parent, SWT.WRAP); 
         label.setText("Es ist jetzt: " + new Date().toLocaleString()); 

         Display d = parent.getDisplay();
         d.asyncExec(new Runnable() { 
              public void run() { 
                    while(!parent.isDisposed()) {
       	        label.setText("Es ist jetzt: " + new Date().toLocaleString());
                    }
      	  } 
      	});
      } 

      public void setFocus() { 
      } 

   }
```


----------

