SWTException beim Schließen einer ViewPart

  • Themenstarter Themenstarter wm
  • Beginndatum Beginndatum

wm

Mitglied
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?
Java:
    //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);
            }

        }
    };
 
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.
 
@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)
 
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.
 
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
 
ich weiß nicht wie ihr das macht, aber mit
Java:
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
 
Zuletzt bearbeitet:
ich weiß nicht wie ihr das macht, aber mit
Java:
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

He?
Hast du mein Beitrag gelesen? Du greifst auf ein widget zu wahrscheinlich
Java:
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.
 
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.
 
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.
 
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.
 
jetzt wird keine Exception mehr geworfen
Java:
...
!parent.isDisposed()
...
public void createPartControl(Composite parent) {
...
}
 

Zurück
Oben