延迟 SWT 表格刷新

3
我们有一个ViewerFilter用于TableViewer,但是速度有点慢,为了给人留下更好的印象,我们希望在刷新窗口之前让视图器等待500毫秒(否则,在每次按键后都会阻塞)。
由于我不知道自己在做什么,所以尝试创建一个类,检查System.currentTimeMillis()是否大于来自不同线程的最后一次按键时间+500。这只会导致抛出无效线程访问异常,所以我很迷茫。
编辑:我能够使用TableViewer.getTable().getDisplay().asyncExec()绕过无效线程问题,但我不喜欢我的解决方案,希望听到其他建议。
2个回答

2
您可能想尝试在更新查看器时关闭重绘。
Viewer.getControl().setRedraw(false);
// update
Viewer.getControl().setRedraw(true);

有时候这可以提供更好的用户体验。您还可以安排一个UI任务,当用户按下新键或修改文本时,您可以取消它。例如:

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);
        }
    });
}

如果用户按下回车键,您可以立即安排刷新作业,无需延迟。

谢谢!我最终使用了这两个概念,它们的效果非常好。为了解决未来的问题:monitor.beginTask("Refreshing", ProgressMonitor.UNKNOWN); 应该是 IProgressMonitor.UNKNOWN - mwalling
这应该在JFace/Workbench Job文档中。非常感谢! - zedoo

0
只需将您的代码包装在display.syncExec中,就像这样:
Display.getDefault().asyncExec(new Runnable() {
 public void run() {
      // check refresh time
      // refresh.
 }
});

如果syncExec不能满足您的需求,您可能还想了解一下asyncExec。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接