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, выполняющим обработку. Если вы попытаетесь взаимодействовать со своим приложением, вы заметите, что в пользовательском интерфейсе ничего не реагирует.

Решение этой проблемы состоит в том, чтобы не выполнять обработку в потоке пользовательского интерфейса - запустить другой поток, выполнить обработку этого и перезвонить потоку пользовательского интерфейса, чтобы обновить индикатор выполнения.

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