Я хочу использовать монитор прогресса, чтобы показывать прогресс во время начала реального сложного диалога!!!
Создание диалога выполняется в потоке диспетчера событий. В зависимости от клиентской системы это может занять до 10 секунд.
Мое желание состоит в том, чтобы видеть на переднем плане монитор прогресса, который показывает статус каждой текущей части загрузки. Тем временем Диалог строится на заднем плане.
Проблема в том, что progressmonitor всегда зависает до тех пор, пока диалог не будет запущен. Когда запуск диалога закончен, progressmonitor реагирует и показывает текущее состояние.
Пробовал много чего читал на форумах, но без двух разных тем не получается. Вот пример, который позволяет отслеживать прогресс и создание диалога в EDT.
final CVProgressMonitorDialog progressMonitor = new CVProgressMonitorDialog();
progressMonitor.startPollingThread();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
try {
startComplexDialog();
}
finally {
close(progressMonitor);
}
}
});
CVProgressMonitorDialog в основном представляет собой ProgressMonitor, поставляемый с Swing.
Решение состоит в том, чтобы позволить созданию диалога работать в другом потоке.
final CVProgressMonitorDialog progressMonitor = new CVProgressMonitorDialog();
progressMonitor.startPollingThread();
new Thread() {
@Override
public void run() {
try {
startComplexDialog();
}
finally {
close(progressMonitor);
}
}
}.start();
Вызывает ли использование второго решения потенциальные проблемы, поскольку Swing не является потокобезопасным?
Существует ли общее решение задачи мониторинга в EDT?