我有一个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
}
所以我只在需要时创建浏览器。
答案 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来隐藏它。