(В моем приложении с графическим интерфейсом Swing) я хочу отображать GlassPane во время некоторой работы, выполняемой в цикле или методе, который вызывается после нажатия JButton.
Например: (действие выполняется после нажатия кнопки)
if (item.equals(button)) {
glassPane.setVisible(true);
someTimeConsumingMethod();
glassPane.setVisible(false);
}
Выполнение этого кода приводит к тому, что glassPane не отображается во время выполнения someTimeConsumingMethod () - графический интерфейс просто зависает на мгновение, прежде чем отобразится результат. Удаление последней строки в этом цикле (glassPane.setVisible (false);) приводит к отображению glassPane после выполнения метода (когда графический интерфейс размораживается).
Есть ли простой способ показать, что glassPane до того, как GUI зависнет, или мне нужно использовать здесь некоторые дополнительные знания? (потоки?)
ОБНОВЛЕНИЕ1:
Я обновил свой код в соответствии с ответом davidXYZ (с двумя изменениями):
(действие выполняется после нажатия кнопки)
if (item.equals(button)) {
glassPane.setVisible(true);
new Thread(new Runnable(){
public void run(){
someTimeConsumingMethod(); // 1st change: running the someTimeConsumingMethod in new Thread
// instead of setting glassPane to visible
}
}).start();
// 2nd change: moved glassPane.setVisible(false); inside the someTimeConsumingMethod(); (placed at the end of it).
}
Точка 1-го изменения заключается в том, что установка glassPane, видимая в новом потоке прямо перед запуском someTimeConsumingMethod в моем потоке графического интерфейса, открывала glassPane после завершения someTimeConsumingMethod (дважды проверил это).
Теперь все работает нормально, спасибо за все ответы. Я обязательно проверю все ссылки, которые вы предоставили, чтобы понять темы!
UPDATE2: Дополнительная информация: someTimeConsumingMethod (); в моем приложении готовятся новые компоненты Swing в соответствии с данными XML (карты, созданные из JButtons и JLabels с несколькими JPanels, где это необходимо, и добавление их в нужных местах).
UPDATE3: Я пытаюсь заставить его работать, используя метод SwingWorker invokeLater. Теперь это выглядит так:
(действие выполняется после нажатия кнопки)
if (item.equals(button)) {
glassPane.setVisible(true);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
someTimeConsumingMethod();
glassPane.setVisible(false);
}
});
}
Работает не так хорошо, как код из UPDATE1 (но все же - работает). Проблемы:
glassPane загружается без анимации .gif (файл настраивается в пользовательском классе glassPane - он работает с кодом UPDATE1)
есть небольшая задержка в конце «рабочего» процесса - сначала курсор становится нормальным (из WAIT_CURSOR), а через очень короткий момент glassPane исчезает. Курсор изменяется пользовательским классом glassPane при активации / деактивации (без задержки с использованием нового способа Thread).
Это правильный способ использования метода SwingWorker invokeLater?
РЕДАКТИРОВАТЬ: Моя ошибка, я перепутал SwingWorker с SwingUtilities.invokeLater (). Я предполагаю, что проблема с изображением связана с зависанием графического интерфейса при запуске someTimeCOnsumingMethod.
glassPane
был виден во время работыsomeTimeConsumingMethod
, а затем закрывал его сразу после завершения функции? - person davidXYZ   schedule 26.09.2012