如何在 Eclipse 插件中使用 Timer 和 SwingWorker?

How to use Timer and SwingWorker in an Eclipse Plugin?

我正在开发一个 Eclipse 插件,它将通过视图为 GUI 做出贡献。

当用户在工作区中选择文件夹或文件时,视图会使用来自版本控制系统的信息进行更新。

为了避免每次用户浏览项目子文件夹和文件时收集数据,我需要等待 3 秒以确保文件或文件夹是感兴趣的文件或文件夹。

我目前正在使用 Swing 计时器执行此操作。

这对于少量数据是可以的,但是对于大量数据,GUI 会阻塞,等待计时器执行更新功能。

我知道对于这种任务我可以使用 SwingWorker 但我不知道如何延迟任务并在需要时重新启动延迟。

谁能告诉我如何正确解决这个问题?

这是我当前的代码:

  public void resetTimerIfNeeded()
    {
        if(timer.isRunning())
            timer.restart();
        else
            timer.start();
    }


    public void timer()
    {
        selectionTimer = new Timer(3000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO Auto-generated method stub


                Display.getDefault().syncExec(new Runnable(){
                    @Override
                    public void run()
                    {               
                        updateView();
                        selectionTimer.stop();                  
                    }
                }); 
            }
        });
    }

由于 Eclipse 使用 SWT 而不是 Swing,因此最好避免使用 Swing 代码。

您可以 运行 在延迟后使用 UIJob 在 UI 线程中编码,例如:

UIJob job = new UIJob("Job title") {
        @Override
        public IStatus runInUIThread(IProgressMonitor monitor) {

            updateView();

            return Status.OK_STATUS;
        }
    };

job.schedule(3000);

或者您可以使用 Display.timerExec:

Display.getDefault().timerExec(3000, new Runnable(){
         @Override
         public void run()
         {               
           updateView();
         }
    });

改为将其安排为作业:https://eclipse.org/articles/Article-Concurrency/jobs-api.html . Use a UIJob if the entirety of what it's doing is interacting with the UI. The cancel/schedule and sleep/wakeUp methods will be of interest , see http://help.eclipse.org/luna/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/runtime/jobs/Job.html 用于 JavaDoc。