SWT浏览器似乎在处理之后仍然存在

时间:2014-04-01 14:32:14

标签: java browser swt ole

我有一个SWT应用程序,我使用画布来显示图像,视频和PDF文件。用户可以将任何媒体类型拖到画布上。我使用浏览器对象仅显示PDF。当我完成显示PDF时,我只是处理浏览器。有时它会起作用,但有时浏览器不会消失,我的画布上会出现僵尸浏览器窗口。

为什么我会获得僵尸浏览器?

我的canvas类有一个draw方法,就像这样

        public void draw(GC gc) {      
            if (mediaType == PDF) { 
                if (browser == null)
                    browser = new Browser(this, SWT.NONE);
            }
            else if (browser != null) {
                browser.dispose();
                browser = null;
            }
            // etc, etc
        }

所以我只在需要时创建浏览器。

1 个答案:

答案 0 :(得分:2)

问题是新浏览器(此,SWT.NONE) 有时调用画布绘制方法。因此,如果您在绘图中创建一个新的浏览器,可能会多次调用draw方法,在这种情况下将为您提供多个浏览器。

我在绘图开始时添加了一个Thread.dumpStack()并得到了它。

    java.lang.Throwable
        at java.lang.Thread.dumpStack(Thread.java:417)
        at com.acme.client.widget.canvas.AcmeImageCanvas.draw(AcmeImageCanvas.java:1923)
        at com.acme.client.widget.canvas.AcmeImageCanvas.paintControl(AcmeImageCanvas.java:1888)
        at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
        at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
        at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
        at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
        at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
        at org.eclipse.swt.widgets.Composite.WM_PAINT(Unknown Source)
        at org.eclipse.swt.widgets.Control.windowProc(Unknown Source)
        at org.eclipse.swt.widgets.Canvas.windowProc(Unknown Source)
        at org.eclipse.swt.widgets.Display.windowProc(Unknown Source)
        at org.eclipse.swt.internal.ole.win32.COM.VtblCall(Native Method)
        at org.eclipse.swt.internal.ole.win32.IDispatch.Invoke(Unknown Source)
        at org.eclipse.swt.ole.win32.OleAutomation.invoke(Unknown Source)
        at org.eclipse.swt.ole.win32.OleAutomation.setProperty(Unknown Source)
        at org.eclipse.swt.browser.IE.create(Unknown Source)
        at org.eclipse.swt.browser.Browser.<init>(Unknown Source)
        at com.acme.client.widget.canvas.AcmeImageCanvas.draw(AcmeImageCanvas.java:1923)
        at com.acme.client.widget.canvas.AcmeImageCanvas.retrieveImage(AcmeImageCanvas.java:4679)
        at com.acme.client.widget.canvas.AcmeThumbnailCanvas.mouseUp(AcmeThumbnailCanvas.java:1761)
        at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
        at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
        at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
        at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
        at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
        at com.acme.client.uiframework.AcmeApp.main(AcmeApp.java:1674)

你可以看到浏览器。&lt; init&gt;调用画布绘制方法。

解决方案是将浏览器构造移动到其他地方,并使用setVisible(false)而不是dispose来隐藏它。