2014-04-01 72 views
1

我有一個SWT應用程序,我用畫布來顯示圖像,視頻和PDF文件。用戶可以將任何媒體類型拖放到畫布上。我只使用瀏覽器對象來顯示PDF。當我完成展示PDF時,我只是處理瀏覽器。有時候這會起作用,但有時瀏覽器不會消失,我的殭屍瀏覽器窗口會粘在我的畫布上。SWT瀏覽器似乎堅持,即使我處置它

爲什麼我會得到殭屍瀏覽器?

我的畫布類有一個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 
     } 

所以我只當我需要它創建的瀏覽器。

回答

2

的問題是,新的瀏覽器(這一點,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來隱藏它。

+0

回想起來,爲什麼我的paintControl調用畫?這是問題的真正原因。我把我的paintControl改爲不調用draw,然後改回原來的新策略/在draw中放置Browser。 –

相關問題