Задержка обновления таблицы SWT - PullRequest
3 голосов
/ 25 января 2010

У нас есть ViewerFilter для TableViewer , который немного медленный, поэтому, чтобы создать впечатление удивительности, мы хотели, чтобы зритель подождал 500 миллисекунд, прежде чем обновлять окно (в противном случае оно блокировалось после каждого нажатия клавиши).

Не имея представления о том, что я делал, я попытался создать класс, который бы проверял, больше ли System.currentTimeMillis (), чем время последнего нажатия клавиши + 500 из другого потока. Это просто вызвало исключение Invalid thread access, поэтому я потерялся.

Редактировать: Мне удалось использовать TableViewer.getTable (). GetDisplay (). AsyncExec (), чтобы обойти проблему с недопустимым потоком, но мне не нравится мое решение, и я хотел бы услышать другие предложения.

Ответы [ 2 ]

2 голосов
/ 26 января 2010

Возможно, вы захотите попробовать отключить перерисовку при обновлении программы просмотра.

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

Если пользователь нажимает клавишу Enter, вы можете запланировать обновление без задержки,

0 голосов
/ 26 января 2010

Просто оберните ваш код в display.syncExec , что-то вроде этого:

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

Возможно, вы захотите заглянуть и в asyncExec, если syncExec не соответствует вашим потребностям.

...