Установка окна ожидания на стекле не работает в диалоге

У меня есть приложение, которое иногда запускает длительный процесс в фоновом потоке. Если это происходит из основного приложения, я устанавливаю курсор ожидания следующим образом:

oldCursor = App.getInstance().getGlassPane().getCursor();
App.getInstance().getGlassPane().setVisible(true);
App.getInstance().getGlassPane().setCursor(waitCursor);

Это работает, и я отключаю курсор следующим образом:

App.getInstance().getGlassPane().setCursor(oldCursor);
App.getInstance().getGlassPane().setVisible(false);

Итак, теперь я иногда делаю долгосрочную задачу от JDialog, (она имеет setModal(true)) Делать это в JDialog никогда не меняет курсор:

oldCursor = getGlassPane().getCursor();
getGlassPane().setVisible(true);
getGlassPane().setCursor(waitCursor);

Итак, я попытался установить его для приложения, и это тоже не сработало.

Есть ли способ заставить это работать?

0 ответов

Я знаю, что этот вопрос очень старый. Однако у меня был тот же вопрос, и мне потребовалось время, чтобы поискать старые темы на многих веб-сайтах, прежде чем я смог найти решение. Разместите его здесь, чтобы помочь мне (и, возможно, другим) найти его в будущем.

Для справки, https://www.javaspecialists.eu/archive/Issue065-Wait-Cursor-Wait.html объясняет, почему код OP не работает. К сожалению, решения, представленные в этой статье, далеки от идеала (например, установить курсор до открытия диалогового окна, а затем вернуться обратно после его закрытия).

Однако поскольку JDialog это контейнер Swing верхнего уровня, вы можете вызвать GetRootPane() прямо на нем, чтобы получить доступ к изменению курсора:

getRootPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
// long running code here
getRootPane().setCursor(Cursor.getDefaultCursor());

Еще одно улучшение - установить курсор ожидания в блоке try и вернуть курсор по умолчанию в finally, чтобы у вас не остался навсегда курсор ожидания, если есть исключение:

try {
    getRootPane().setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
    // long running code here
} finally {
    getRootPane().setCursor(Cursor.getDefaultCursor());
}
Другие вопросы по тегам