SWT - настройка моего ProgressMonitorDialog
У меня есть рабочий ProgressMonitorDialog, но я хочу убедиться, что я его правильно настраиваю.
Сначала код:
Способ создания диалога
public void startProgressBar() {
try {
new ProgressMonitorDialog(getShell()).run(true, true,
new ProgressBarThread());
}
catch (InvocationTargetException e) {
MessageDialog.openError(getShell(), "Error", e.getMessage());
}
catch (InterruptedException e) {
MessageDialog.openInformation(getShell(), "Cancelled", e.getMessage());
}
}
Файл класса
class ProgressBarThread implements IRunnableWithProgress {
private static final int TOTAL_TIME = 1000;
public ProgressBarThread() {
}
public void run(IProgressMonitor monitor) throws InvocationTargetException,InterruptedException {
monitor.beginTask("Creating PDF File(s): Please wait.....", IProgressMonitor.UNKNOWN);
for (int total = 0; total < TOTAL_TIME ; total++) {
Thread.sleep(total);
monitor.worked(total);
if (total == TOTAL_TIME / 2) monitor.subTask("Please be patient... Operation should finish soon.");
}
monitor.done();
}
}
Метод, который вызывает ProgressBar и запускает операцию создания PDF-файла.
private void startSavePdfOperation() {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
startProgressBar();
}
});
saveOp = new AplotSaveOperation(appReg.getString("aplot.message.SAVETOPDF"), "PDF", session);
saveOp.addOperationListener(new MyOperationListener(this) {
public void endOperationImpl() {
java.io.File zipFile = null;
try {
AplotSaveResultsParser.SaveResult saveResults = saveOp.getSaveResults();
if (saveResults != null) {
ETC..... ETC......
Вопросов:
Поскольку ProgressMonitorDialog является графическим интерфейсом, его необходимо выполнить в Display.getDefault (). AsyncExec?
Если ProgressMonitorDialog выполняется в отдельном потоке, как он узнает, что закрывается, когда операция завершена?
Есть ли связь между индикатором выполнения и операцией?
Я прав в предположении, что цикл for в классе ProgressBarThread - это в основном таймер, который держит монитор открытым?
Есть ли способ увеличить скорость индикатора ProgressMonitorDialog, также вы можете удалить кнопку отмены?
Это то, что я думаю, что происходит в настоящее время.
Я запускаю индикатор выполнения непосредственно перед запуском прослушивателя операций в формате PDF.Смотрите startSavePdfOperation () выше
Индикатор выполнения работает как неизвестный, но использует цикл for, чтобы держать диалоговое окно индикатора выполнения открытым, пока операция выполняется в потоке в фоновом режиме.
Смотрите класс ProgressBarThread выше
Когда операция PDF завершается, класс операций слушателя закрывает диалоговое окно основного графического интерфейса.
public void endOperation() {
try {
endOperationImpl();
}
finally {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
w.getShell().setCursor(new Cursor(Display.getCurrent(), SWT.CURSOR_ARROW));
w.recursiveSetEnabled(getShell(), true);
w.getShell().setEnabled(!getShell().getEnabled());
w.close();
}
});
}
}
Я не уверен, что происходит с монитором ProgressBarThread?
Это возможно?
Когда начинается операция PDF, ProgressMonitorDialog открывается и запускает индикатор. Хорошо с сохранением этого неизвестным.
Когда операция PDF завершается, монитор закрывается, затем базовый диалог
Я просто хочу открыть диалоговое окно индикатора выполнения, которое сообщит пользователю, что его запрос работает в фоновом режиме.
Как указано выше, код работает, но я боюсь, что закрытие базового графического интерфейса пользователя может привести к тому, что уничтожение моего Progress Thread и Monitor не является хорошей практикой.