的問題是,新的瀏覽器(這一點,SWT.NONE)有時調用畫布繪製方法。所以如果你在draw中創建一個新的瀏覽器,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)
你可以看到瀏覽器。 < init>調用畫布繪製方法。
解決方案是將Browser構建移到其他地方,並使用setVisible(false)而不是dispose來隱藏它。
回想起來,爲什麼我的paintControl調用畫?這是問題的真正原因。我把我的paintControl改爲不調用draw,然後改回原來的新策略/在draw中放置Browser。 –