Я использую Swing Application Framework в своей программе. И у меня есть многолетняя работа. Я использую для этого 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, но мое главное окно отображается неправильно, и мой ProgressBar не отображается.
Мне нужно, когда задача запускает программу, ждет ее, но пользователь может видеть 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;
}
}
Лучший способ, чтобы получить помощь, чтобы получить возможность отправлять код, который имеет проблемы, вы можете описать. Если вы можете опубликовать отдельный рабочий пример, это самый быстрый способ получить помощь. Это может также помочь вам подумать о проблеме. – ditkin