java - SWT 浏览器似乎在我丢弃后仍然存在

标签 java browser swt ole

我有一个 SWT 应用程序,我使用 Canvas 来显示图像、视频和 PDF 文件。用户可以将任何媒体类型拖到 Canvas 上。我使用浏览器对象仅用于显示 PDF。当我显示完 PDF 后,我只需处理浏览器即可。有时这有效,但有时浏览器不会消失,我的 Canvas 上粘着一个僵尸浏览器窗口。

为什么我会遇到僵尸浏览器?

我的 Canvas 类有一个绘制方法,如下所示

        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
        }

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

最佳答案

问题是new Browser(this, SWT.NONE)有时调用canvas 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)

你可以看到Browser.调用了canvas绘制方法。

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

关于java - SWT 浏览器似乎在我丢弃后仍然存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22788961/

相关文章:

JAVA、SWT 在封闭范围内定义的局部变量必须是最终的或有效最终的

java - 如何调整组合框下拉列表的大小?

java - 在 Groovy 中声明函数

html - 图片不显示在网站上但本地不显示?

javascript - 如果 Web 浏览器是 IE,请在 JavaScript 中执行某些操作

C# WebBrowser 控制 System.AccessViolationException

java - 布局忽略了希望增长的控件?

java - CAdES 数字签名

java - 如何在数据库表中插入每天唯一的登录计数的单独行

java - 有任何 Guava 概述吗?