Java GUI JProgressBar не рисует
У меня есть проблема с графическим интерфейсом, которую я хотел бы решить, но я озадачен тем, что происходит, и надеюсь, что один из вас сможет это объяснить. База кода слишком велика для загрузки, однако я подробно объясню, что происходит:
У меня есть класс ProgessBar
который является JDialog
содержащий качели JProgressBar
, У меня есть некоторые методы получения и установки, чтобы изменить планку по своему вкусу, однако здесь возникает проблема.
ProgressBar создается внутри метода myButtonActionPerformed
myButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
myButtonActionPerformed(evt);
}
});
по существу, когда пользователь нажимает эту кнопку, начинается обработка и ProgressBar
порождается
У пользователя в данный момент есть JFrame
перед ними, и этот индикатор выполнения выскочил в JDialog
, После перехода в режим отладки в Netbeans я вижу JProgressBar
Значения меняются, но полоса визуально остается на уровне 0% во время обработки моей программы, а затем мгновенно переходит на 100%, как только она покидает метод прослушивателя добавления действия, описанный выше, почти как если бы она ожидала перерисовки до тех пор, пока не выйдет из этого прослушивателя. Что я не понимаю? Есть ли что-то, что я могу назвать, что заставит его обновить внутри этого myButtonActionPerformed
метод, а не ждать, пока он бесполезен.
3 ответа
Вы делаете все, что занимает это время в EDT? Имейте в виду, что в AWT/Swing есть специальный поток, который выполняет работу с графическим интерфейсом - обрабатывает обработчики событий, перерисовывает графический интерфейс и т. Д. Если вы выполняете долго выполняемые действия в этом потоке, Swing не будет перерисовываться.
Попробуйте выполнить свою задачу в другом потоке и обновите оттуда индикатор выполнения соответствующим образом. использование SwingUtilities.invokeLater
или же invokeAndWait
обновить индикатор выполнения, чтобы гарантировать, что обновления GUI происходят на EDT. В противном случае все становится очень странным.
Сначала ваш анонимный ActionListener просто пересылает метод myButtonActionPerformed, так что, очевидно, проблема не в опубликованном коде, а в том, что происходит или вызывается внутри myButtonActionPerformed. Так что это будет соответствующий код для публикации (если это возможно).
Во-вторых, другие люди, вероятно, уже прибили это, потому что вероятная вещь действительно тяжелая обработка на EDT. Можно использовать SwingWorkers для эффективной маршрутизации обновлений хода выполнения / состояния в поток графического интерфейса в зависимости от ситуации, а также для перемещения фоновой обработки за пределы EDT.
Третье: из интереса, вы случайно не использовали NetBeans для дизайна своего графического интерфейса? Похоже, это автоматически сгенерированный код, для меня.
Причина, по которой он не обновляется, заключается в том, что ваш поток пользовательского интерфейса занят обработчиком ActionPerformed, выполняющим обработку. Если вы попытаетесь взаимодействовать со своим приложением, вы заметите, что в пользовательском интерфейсе ничего не реагирует.
Решение этой проблемы состоит в том, чтобы не выполнять обработку в потоке пользовательского интерфейса - запустить другой поток, выполнить обработку этого и перезвонить потоку пользовательского интерфейса, чтобы обновить индикатор выполнения.