Установка окна ожидания на стекле не работает в диалоге
У меня есть приложение, которое иногда запускает длительный процесс в фоновом потоке. Если это происходит из основного приложения, я устанавливаю курсор ожидания следующим образом:
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());
}