Java: "пожалуйста, подождите" GlassPane не правильно загружен
У меня есть Java-рутина, которая занимает несколько секунд, чтобы быть завершенным. Я хотел бы загрузить GlassPane
(возможно, с сообщением "prease wait" внутри), которое запрещает пользователю изменять пользовательский интерфейс во время выполнения этой подпрограммы и автоматически скрывается при ее завершении. Для этого я использую следующий код:
Thread t = new Thread(new Runnable(){
@Override
public void run() {
/*
* `getPresentation().getFrame()` are methods that return the
* Frame which contains my UI
*/
getPresentation().getFrame().setGlassPane(myGlassPane);
getPresentation().getFrame().getGlassPane().setVisible(true);
}
});
t.start();
//this is the routine that takes several seconds to be executed
runCEM();
//hide the GlassPane
getPresentation().getFrame().getGlassPane().setVisible(false);
Я установил конкретный java.awt.Cursor
в myGlassPane
, Когда я запускаю приведенный выше код, я вижу новый java.awt.Cursor
появляется, но не весь GlassPane
с сообщением "пожалуйста, подождите" и так далее...
Любая идея о том, что может вызвать эту проблему? Есть ли, возможно, другие лучшие способы получить то, что я ищу, вместо того, чтобы использовать GlassPane
а также Thread
?
1 ответ
Swing не является потокобезопасным, поэтому вы уже нарушаете однопоточные правила Swing, возможно, для двух учетных записей. Во-первых, стеклянная панель должна быть показана и скрыта в контексте EDT (нити диспетчеризации событий).
Ваш длительный процесс должен выполняться вне EDT.
Самое простое решение, которое я могу придумать, это использовать SwingWorker
, Это обеспечивает ряд полезных механизмов, которые вы можете использовать для выполнения длительных или блокирующих процессов в другом потоке и безопасного обновления пользовательского интерфейса.
Взгляните на параллелизм в Swing и рабочих потоках и SwingWorker для получения более подробной информации