2017-06-21 37 views
1

我使用Eclipse RAP,並具有以下的用例:在Eclipse RAP中如何將當前UI狀態推送/強制給客戶端?

  • 進入一個Text字段中搜索文本,並開始搜索
  • 變化Label文本「搜索...」
  • 做一個Table

問題實際搜索(異步)和顯示效果,即使標籤應更改爲「搜索....「在開始實際搜索之前,它將更改爲」正在搜索....「搜索完成後。

我正在尋找的是推/強制/更新當前的UI狀態到客戶端的標籤更改後,之前的搜索方式:

  • 進入一個Text領域,開始搜索文本搜索
  • 變化Label文本「搜索...」
  • 推動當前的UI狀態,客戶端
  • 做實際的搜索(異步),並顯示結果在Table

這裏是一些示例代碼:

Label statusLabel = new Label(parent, SWT.NONE); 
    Text searchText = new Text(parent, SWT.SEARCH); 
    searchText.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetDefaultSelected(SelectionEvent e) { 
      // change label 
      statusLabel.setText("searching..."); 

      // HERE force client update 

      // start searching 
      Display.getCurrent().asyncExec(new Runnable() { 
       @Override 
       public void run() { 
        // do actual search 
       } 
      }); 
     } 
    }); 

回答

2

asyncExec仍然運行在UI線程的代碼,它只是延緩它稍微直到Display.readAndDispatch下一個電話。因此,您的搜索代碼仍會阻止並且不允許標籤更新。

您需要在單獨的線程中實際運行搜索。

asyncExec旨在用於後臺線程以在可能的情況下在UI線程中運行少量代碼。 (您需要在後臺線程中使用Display.getDefault()而不是Display.getCurrent())。

所以在你的後臺線程你做這樣的事情:

while (more to do) 
{ 
    .... do a step of the search 

    Display.getDefault().asyncExec(.... UI update code ....); 
} 
+0

如果我運行在一個獨立的線程搜索,我將無法訪問用戶界面嗎?例如更新狀態標籤,更新結果表。我會遇到「無效的線程訪問」異常,我猜? –

+0

您可以在後臺線程中使用'asyncExec'(或'syncExec')來運行您的UI更新代碼 - 就是這樣。 –

+0

Display.getDefault()和Display.getCurrent()在線程中都是null,我必須在啓動線程之前將其存儲爲變量。 –

相關問題