ProgressBar не меняет своего значения в Java - PullRequest
6 голосов
/ 17 апреля 2011

У меня странная проблема. Я установил JProgressBar:

private JProgressBar progressBar;

public void foo()
{
    ...
    progressBar = new JProgressBar(0, 100);
    progressBar.setValue(0);
    progressBar.setStringPainted(true);
    ...
    contentPane.add(progressBar);
    ...
}

Но это меняется только когда я помещаю функцию setValue в некоторых местах кода, а не везде:

public void foo2()
{
    progressBar.setValue(100); //working
    if(...)
    {
        System.out.println("These instructions are executing"); //working
        progressBar.setValue(0);                                //not working
    }                             
}

Итак, что я делаю не так? Почему вторая инструкция не работает?

Ответы [ 2 ]

16 голосов
/ 17 апреля 2011

Значение индикатора выполнения действительно обновлено. Но это не просто на экране. Часто мы используем индикаторы выполнения в циклах. Но пока вы находитесь в цикле, который вы, вероятно, вызываете, нажимая кнопку , он не закрашивается. Зачем? Потому что вы вызвали его, нажав кнопку. Когда вы нажимаете кнопку, весь код, который вы создали для этой кнопки, выполняется AWTEventThread. Это та же самая нить, которая отслеживает все компоненты Swing и проверяет, нужно ли их перекрашивать. Это нить, которая оживляет ваш JFrame. Когда вы наводите кнопку и цвет немного меняется, это делается с помощью AWTEventThread.

Итак, пока вы работаете в цикле, AWTEventThread больше не может обновлять экран.

Это означает, что есть два решения:

  1. (Рекомендовать) Вам следует создать отдельный поток, который выполняет цикл. Это означает, что AWTEventThread может обновить экран при необходимости (когда вы звоните bar.setValue(...);)

    public void yourButtonClickMethod()
    {
        Runnable runner = new Runnable()
        {
            public void run() {
            //Your original code with the loop here.
            }
        };
        Thread t = new Thread(runner, "Code Executer");
        t.start();
    }
    
  2. Вручную перекрасить индикатор выполнения. Я делал это всегда с bar.repaint();, но мне интересно, будет ли это работать. Я думал, что это был тот метод. Если это не сработает, попробуйте: bar.update(bar.getGraphics());.

0 голосов
/ 21 июня 2013

Несмотря на то, что на этот вопрос уже был дан ответ, я нашел другой способ, который действительно работал для меня.Я использовал Swing worker и использовал propertyChange (null) для обновления индикатора выполнения. Это было самое простое решение.

Просто хотел предложить эту альтернативу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...