Java GUI JProgressBar не рисует - PullRequest
       5

Java GUI JProgressBar не рисует

3 голосов
/ 01 июля 2010

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

У меня есть класс 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 ]

5 голосов
/ 01 июля 2010

Делаете ли вы все, что занимает это время в EDT? Имейте в виду, что в AWT / Swing есть специальный поток, который выполняет работу с графическим интерфейсом - обрабатывает обработчики событий, перерисовывает графический интерфейс и т. Д. Если вы выполняете в этом потоке длительные действия, Swing не будет перерисовываться.

Попробуйте выполнить свою задачу в другом потоке и обновите оттуда индикатор выполнения соответствующим образом. Используйте SwingUtilities.invokeLater или invokeAndWait, чтобы обновить индикатор выполнения, чтобы гарантировать, что обновления GUI происходят на EDT. В противном случае все становится очень странным.

1 голос
/ 01 июля 2010

Сначала ваш анонимный ActionListener просто пересылает метод myButtonActionPerformed, поэтому проблема, очевидно, не в опубликованном коде, а в том, что происходит или вызывается внутри myButtonActionPerformed.Так что это будет соответствующий код для публикации (если это возможно).

Во-вторых, другие люди, вероятно, уже прибили это, потому что вероятная вещь действительно тяжелая обработка на EDT.Можно использовать SwingWorkers для эффективной маршрутизации обновлений хода выполнения / состояния в поток графического интерфейса в зависимости от ситуации, а также перенести фоновую обработку из EDT.

В-третьих: из интереса, вы случайно не используете NetBeans для своего дизайна графического интерфейса?Мне кажется, это автоматически сгенерированный код.

1 голос
/ 01 июля 2010

Причина, по которой он не обновляется, заключается в том, что ваш поток пользовательского интерфейса занят обработчиком ActionPerformed, выполняющим обработку. Если вы попытаетесь взаимодействовать со своим приложением, вы заметите, что в пользовательском интерфейсе ничего не реагирует.

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

...