2010-01-25 35 views
3

我們有一個ViewerFilterTableViewer有點慢,所以爲了給人留下超棒的印象,我們希望查看器在刷新窗口之前等待500毫秒(否則,它會在每個關鍵行程)。拖延SWT表刷新

沒有任何線索我在做什麼,我試着創建一個類來檢查System.currentTimeMillis()是否大於最後一個關鍵筆劃的時間+ 500從另一個線程。這只是導致無效的線程訪問異常被拋出,所以我迷路了。

編輯:。我能夠使用TableViewer.getTable()getDisplay()asyncExec()來回避無效的線程的問題,但我不喜歡我的解決方案,並會喜歡聽到其他建議。

回答

2

您可能想在嘗試更新查看器時關閉重繪。

Viewer.getControl().setRedraw(false); 
// update 
Viewer.getControl().setRedraw(true); 

它有時可以提供更好的用戶體驗。您還可以安排在用戶點擊新密鑰或修改文本時取消的工作。例如。

class RefreshJob extends WorkbenchJob 
{ 
     public RefreshJob() 
     { 
      super("Refresh Job"); 
      setSystem(true); // set to false to show progress to user 
     } 

     public IStatus runInUIThread(IProgressMonitor monitor) 
     { 
      monitor.beginTask("Refreshing", ProgressMonitor.UNKNOWN); 
      m_viewer.refresh(); 
      monitor.done(); 
      return Status.OK_STATUS; 
     }; 
} 

然後在單獨的作業中重新安排刷新。

private RefreshJob    m_refreshJob = new RefreshJob(); 
private Text     m_filterText; 
void hookModifyListener() 
{ 
    m_filterText.addModifyListener(new ModifyListener() 
    { 
     public void modifyText(ModifyEvent e) 
     { 
      m_refreshJob.cancel(); 
      m_refreshJob.schedule(500); 
     } 
    }); 
} 

如果用戶點擊回車鍵,你可以安排一個刷新作業沒有延遲,

+0

謝謝!我最終實際上使用了這兩個概念,並且他們工作得很好。 解決未來的問題:'monitor.beginTask(「Refreshing」,ProgressMonitor.UNKNOWN);'應該是'IProgressMonitor.UNKNOWN' – mwalling 2010-02-18 21:41:00

+0

這應該在JFace/Workbench Job文檔中。非常感謝! – zedoo 2012-08-01 13:12:31

0

只是包裝你的代碼display.syncExec,是這樣的:

Display.getDefault().asyncExec(new Runnable() { 
public void run() { 
     // check refresh time 
     // refresh. 
} 
}); 

您可能希望尋找到asyncExec也是如此,如果syncExec不能滿足您的需求。