# SWTException beim Schließen einer ViewPart



## wm (9. Mai 2011)

In meiner View (ViewPart) habe ich eine asynchron laufende Methode (10mal per sekunde, alle 100 ms). Beim Schließen des Haupfensters (Eclipse) kann ich die SWTException verhindern mit 
 !Display.getCurrent().isDisposed() bzw. 
 !PlatformUI.getWorkbench().isClosing()
Wenn ich aber die ViewPart selbst schließe (mausklick auf [x] des Reiters der View), bekomme ich immer eine SWTException.
Wie kann ich der 'timerToRefreshButtonEnabled' mitteilen, dass die ViewPart geschlossen wurde?

```
//start it
    Display.getDefault().asyncExec(this.timerToRefreshButtonEnabled);
....

    private final Runnable timerToRefreshButtonEnabled = new Runnable() {

        public void run() {

            if (!Display.getCurrent().isDisposed() && !PlatformUI.getWorkbench().isClosing()
                    && (MyViewPartClass.this != null)

            ) {
                if (Eclipse.getSelectedText().trim().equals("")) {
...
                }
                else {
...
                }
                //Wiederhole alle 100 millis
                Display.getCurrent().timerExec(100, this);
            }

        }
    };
```


----------



## Sonecc (9. Mai 2011)

Vielleicht wäre es hilfreich für deine Helfer die Exception genauer zu beschreiben. Eine SWTException kann mehrere Formen haben ("Widget disposed to early u.w.). außerdem wäre eine Stacktrace nie verkehrt....

Zu deinem Problem kann ich aus dem Stehgreif heraus grade nichts weiteres sagen. Wenn mir was einfällt auf dem Weg nach Hause, werd ichs aber posten.


----------



## Gast2 (9. Mai 2011)

Warum benutzt du keinen Job?


----------



## wm (9. Mai 2011)

@SirWayne wie funktioniert der Job / wie geht der?

@Sonecc


!ENTRY org.eclipse.ui 4 0 2011-05-09 17:23:05.242
!MESSAGE Unhandled event loop exception
!STACK 0
org.eclipse.swt.SWTException: Widget is disposed
	at org.eclipse.swt.SWT.error(SWT.java:4083)
	at org.eclipse.swt.SWT.error(SWT.java:3998)
	at org.eclipse.swt.SWT.error(SWT.java:3969)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
	at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
	at org.eclipse.swt.widgets.Table.getSelection(Table.java:2700)
	at plugin.views.Results$1.run(MyViewPart.java:110)
	at org.eclipse.swt.widgets.Display.runTimer(Display.java:4167)
	at org.eclipse.swt.widgets.Display.messageProc(Display.java:3256)
	at org.eclipse.swt.internal.win32.OS.DispatchMessageW(Native Method)
	at org.eclipse.swt.internal.win32.OS.DispatchMessage(OS.java:2459)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3655)
	at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
	at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
	at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
	at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:664)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:115)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:369)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:620)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:575)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1408)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1384)


----------



## Gast2 (9. Mai 2011)

On the Job: The Eclipse 3.0 Jobs API

Die Fehlermeldung sagt doch alles du greifst auf ein widget zu dass schon aufgeräumt ist.


----------



## wm (9. Mai 2011)

Wüsste gerne, wie ich das machen soll. Hab schon einiges herumprobiert, kann das widget nicht erfassen, ja, da wäre mir ja schon geholfen.


----------



## Gast2 (9. Mai 2011)

kannst das widget nicht erfassen? he?
ruf halt davor widget.isDisposed auf außerdem solltest du den job halt beenden wenn die viewpart geschlossen wird also einfach disposed von deiner viewpart überschreiben


----------



## wm (10. Mai 2011)

ich weiß nicht wie ihr das macht, aber mit

```
MyViewPart.this.getViewSite().getShell().isDisposed();
```
erhalte ich das Window von Eclipse und nicht die View. Wenn ich den Reiter über [x] schließe, ist 
MyViewPart.this.getViewSite().getShell().isDisposed();
immer noch false


----------



## Gast2 (10. Mai 2011)

wm hat gesagt.:


> ich weiß nicht wie ihr das macht, aber mit
> 
> ```
> MyViewPart.this.getViewSite().getShell().isDisposed();
> ...



He?
Hast du mein Beitrag gelesen? Du greifst auf ein widget zu wahrscheinlich 

```
Eclipse.getSelectedText()
```
Aber keine Ahnung was das sein soll... Auf jeden Fall kannst du auf dem Widget isDisposed oder ähnliches aufrufen.

Außerdem sollst du von der Viewpart die dispose MEthode überschreiben und den Job wieder aufräumen.


----------



## wm (10. Mai 2011)

Ne, Eclipse.getSelectedText() holt sich den selektierten Text aus dem aktiven Editor, wenn ich meine View schließe über [x], ist der Editor ja noch on.


----------



## Gast2 (10. Mai 2011)

wm hat gesagt.:


> Ne, Eclipse.getSelectedText() holt sich den selektierten Text aus dem aktiven Editor, wenn ich meine View schließe über [x], ist der Editor ja noch on.



1. Hast du einen Job gemacht?
2. hast du die dispose Methode überschrieben?
3. Im Stacktrace steht irgendwo auf welches widget zu zugreifst wo es nicht mehr gibt.


----------



## Sonecc (10. Mai 2011)

plugin.views.Results$1.run(MyViewPart.java:110) <- Das Widget an dieser Stelle ist disposed. Frage an diesem Widget den Status über isDisposed ab und beende den Thread falls es disposed ist.


----------



## wm (11. Mai 2011)

jetzt wird keine Exception mehr geworfen

```
...
!parent.isDisposed()
...
public void createPartControl(Composite parent) {
...
}
```


----------



## Gast2 (11. Mai 2011)

gut , wie gesagt ich würde trotzdem einen job machen dafür wurden sie erfunden


----------

