簡體   English   中英

調試窗口小部件被處置異常

[英]Debugging a `Widget is disposed` exception

一個小部件被處置異常被拋出到我們的應用程序中,我正在努力尋找導致該問題的小部件。

它是一個具有多個視角和視圖的RCP 4應用程序。 發生異常時,堆棧跟蹤會顯示要調用的最后一段代碼,但不會告訴我們已丟棄了哪個小部件。

我嘗試過在Widgetdispose方法上設置斷點,但是有太多的widget被丟棄,這是禁止的。

!ENTRY org.eclipse.e4.ui.workbench 4 0 2019-04-26 10:14:00.114
!MESSAGE Internal Error
!STACK 0
org.eclipse.swt.SWTException: Widget is disposed
    at org.eclipse.swt.SWT.error(SWT.java:4595)
    at org.eclipse.swt.SWT.error(SWT.java:4510)
    at org.eclipse.swt.SWT.error(SWT.java:4481)
    at org.eclipse.swt.widgets.Widget.error(Widget.java:451)
    at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:350)
    at org.eclipse.swt.widgets.Control.computeSize(Control.java:663)
    at org.eclipse.swt.custom.ScrolledCompositeLayout.computeSize(ScrolledCompositeLayout.java:36)
    at org.eclipse.swt.widgets.Composite.computeSizeInPixels(Composite.java:218)
    at org.eclipse.swt.widgets.Control.computeSize(Control.java:666)
    at org.eclipse.swt.layout.GridData.computeSize(GridData.java:494)
    at org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:224)
    at org.eclipse.swt.layout.GridLayout.layout(GridLayout.java:200)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1362)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1369)
    at org.eclipse.swt.widgets.Composite.updateLayout(Composite.java:1347)
    at org.eclipse.swt.widgets.Composite.setLayoutDeferred(Composite.java:1148)
    at org.eclipse.swt.widgets.Display.runDeferredLayouts(Display.java:3968)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3540)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1173)
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:339)
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1062)
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
    at org.eclipse.e4.ui.internal.workbench.swt.E4Application.start(E4Application.java:166)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:137)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:107)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:595)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1501)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1474)

查找小部件被處置異常的最佳方法是什么?

事實證明這與@ greg-449中提到的ScrolledComposite 我第一次看時就錯過了。

我們使用父組合創建了ScrolledComposite ,然后設置了內容。 內容已被處置,但引用仍被存儲,導致微widget is disposed異常。

final ScrolledComposite scroll = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.BORDER);
scroll.setContent(widgetThatIsDisposedLater);

為了解決這個問題,我處理了ScrolledComposite ,這意味着它將不再嘗試使用其處理的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM