gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:57:33 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com