2017-03-01 38 views
0

我在Java項目中使用了SWT Eclipse瀏覽器。使用偵聽SWT運行映射的java方法瀏覽器更改

我創建瞭如下測試頁:

onchange="setTime();fieldChanged();"這意味着Javascript方法調用。 setTime()在頁面上,fieldChanged()映射到Java代碼中。

映射javascript函數 - fieldChanged()在Java中,如下:

private void startListen() { 
    SWTRunner.runInSwtThread(() -> new BrowserFunction(getSwtBrowser().getBrowser(), "fieldChanged") { 
       @Override 
       public Object function(Object[] objects) { 
        swtResultField.setText("" + new Date().getTime() % 1000); 
        return null; 
       } 
      }); 
} 

我有哪個線程我應該運行在Java代碼映射函數問題? 我嘗試在上面的代碼 - 在SWTRunner.runInSwtThread()和在OS X系統上運行它運行良好,但在Windows系統返回SWTException: Invalid thread access在線new BrowserFunction(...)

我應該在哪個線程上運行Java映射函數以避免Windows系統中的異常?

編輯

由於@格雷格-449說我編輯和調用該方法,而且Windows系統上出現錯誤,該方法是這樣的:

private void startListen() { 
     new BrowserFunction(getSwtBrowser().getBrowser(), "fieldChanged") { 
      @Override 
      public Object function(Object[] objects) { 
       getSwtBrowser().getBrowser().getDisplay.asyncExec(() -> swtResultField.setText("" + new Date().getTime() % 1000)); 
       return null; 
      } 
     }; 
    } 

SWTException上new BrowserFunction(..)

拋出
+0

你需要更新這個問題來說明你的大部分代碼是Swing而不是SWT。 –

+0

但問題在於如何在JavaScript中註冊名爲'fieldChanged()'的'BrowserFunction()'並收聽。問題在於線程。 – ACz

+0

不,問題在於你正在混合Swing和SWT,這使線程問題變得更糟。適用於純SWT代碼的答案不適用於Swing + SWT。 –

回答

0

解決

PROBL時間線程依賴於操作系統。在Windows上必須運行Display.asyncExec()

在OS X上必須在SWTRunner.runInSwtThread()上運行。