如何在 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。
我正在开发一个 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。