我在我的程序中使用 Swing 应用程序框架。我有一些长期的工作。我用org.jdesktop.application.Task
它。另一个程序员在我接这个项目之前写了两个任务(我不能问他关于程序的事情)。当任务正在执行时,用户看到进度条没有显示完成百分比,但显示“等待”消息并且用户在任务未结束时无法单击主窗口。没事!但是我找不到创建 ProgressBars 的地方。可能是在某些 xml 文件或属性文件中描述的?
我还写了另一个任务,当它们运行时,我创建的进度条没有显示或显示不正确。我阅读了有关 ProgressBar 和 ProgressMonitor 的信息,但它对我没有帮助。程序在 someTask.execute() 之后继续运行,但我希望它显示 ProgressBar、ProgressMonitor 或其他东西,用户无法单击主窗口,窗口将正确显示。现在,当用户更改窗口时,窗口有黑色“块”。
可能是我需要使用 org.jdesktop.application.TaskMonitor
. 我尝试在这里使用它https://kenai.com/projects/bsaf/sources/main/content/other/bsaf_nb/src/examples/StatusBar.java?rev=235,但我的主窗口显示不正确,我的进度条不显示。
我需要在Task正在运行程序时等待它,但是用户可以看到ProgressBar,可以取消操作并且无法单击主窗口。我该怎么做?
这是我的代码:
public class A{
@Action(name = "ActionName", block = Task.BlockingScope.APPLICATION)
public RequestInfoTask requestInfo() {
RequestInfoTask task = new RequestInfoTask(Application.getInstance());
isSuccessedGetInfo=false;
task.addTaskListener(new TaskListener.Adapter<List<InfoDTO>, Void>() {
@Override
public void succeeded(TaskEvent<List<InfoDTO>> listTaskEvent) {
isSuccessedGetResources=true;
}
});
//Here I want to the program shows ProgressMonitor and user can not click to the main window.
//But small window with message "Progress..." is displayed for several seconds and disappear.
ProgressMonitor monitor = new ProgressMonitor(getMainView(), "Wait! Wait!", "I am working!", 0, 100);
int progress = 0;
monitor.setProgress(progress);
while(!task.isDone()){
monitor.setProgress(progress+=5);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
monitor.setProgress(100);
//This code must run after "task" finishes.
if(isSuccessedGetInfo){
MyTask2 task2 = new MyTask2(Application.getInstance());
isSuccessedTask2=false;
task2.addTaskListener(new TaskListener.Adapter<Map<?,?>, Void>(){
@Override
public void succeeded(TaskEvent<Map<String, ICredential>> arg0) {
isSuccessedTask2=true;
}
});
//Do something with results of task2.
}
return task;
}
}
public class RequestInfoTask extends Task<List<InfoDTO>, Void> {
public RequestInfoTask(Application application) {
super(application);
}
@Override
protected List<InfoDTO> doInBackground() throws Exception {
List<InfoDTO> result = someLongerLastingMethod();
return result;
}
}