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 для получения более подробной информации

Другие вопросы по тегам