Индикатор выполнения JButton Action Listener, обновить без зависания?

У меня есть индикатор выполнения, когда я нажимаю кнопку, на прослушивателе кнопок у меня есть индикатор выполнения, который обновляется по мере загрузки чего-либо. Однако графический интерфейс зависает до завершения загрузки. Как я могу заставить этот индикатор выполнения обновляться по мере продолжения загрузки? Однако, если загрузка начинается, когда приложение компилируется без вмешательства пользователя, загрузка выполняется по мере обновления индикатора выполнения. Однако это полная противоположность прослушивателю действий JButton.

Как я могу использовать SwingWorker, чтобы заставить это работать?

while((i=in.read(data,0,1024))>=0)
                    {
                    totalDataRead=totalDataRead+i;
                    bout.write(data,0,i);
                    float Percent=(totalDataRead*100)/filesize;
                    currentProgress.setValue((int)Percent);

                    float allP = Percent / 5;
                    all.setValue((int)allP);

                    }

Это всего лишь цикл (без catchException), как я могу заставить графический интерфейс обновляться по мере загрузки после прослушивателя кнопок?!


person John Smith    schedule 01.09.2013    source источник


Ответы (2)


Выполните загрузку в другом потоке, используя SwingWorker. Здесь у вас есть полный пример, который мне очень нравится с progressBar, см. setProgress() publish() и < a href="http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#process%28java.util.List%29" rel="nofollow">process()< /а>. Когда вы используете setProgress(), это связанное свойство, вы можете использовать подход шаблона наблюдателя, вы можете зарегистрировать прослушиватель, затем, когда этот метод вызывается, вы задействуете и можете обновить свой progressBar, а также вы отделяете компоненты.

Пример:

public class MyWorker extends SwingWorker<Integer, String> {

  @Override
  protected Integer doInBackground() throws Exception {
    // Start
    publish("Start Download");
    setProgress(1);

    // More work was done
    publish("More work was done");
    setProgress(10);

    // Complete
    publish("Complete");
    setProgress(100);
    return 1;
  }

  @Override
  protected void process(List< String> chunks) {
    // Messages received from the doInBackground() (when invoking the publish() method)
  }
}

и в клиентском коде:

    SwingWorker worker = new MyWorker();
    worker.addPropertyChangeListener(new MyProgressListener());
    worker.execute();

   class MyProgressListener implements PropertyChangeListener {
      @Override
      public void propertyChange(final PropertyChangeEvent event) {
        if(event.getPropertyName().equalsIgnoreCase("progress")) {
          downloadProgressBar.setIndeterminate(false);
          downloadProgressBar.setValue((Integer) event.getNewValue());
        }         
      }
     }
person nachokk    schedule 01.09.2013
comment
У меня до сих пор нет абсолютно никакого представления о том, как сделать что-либо из этого SwingWorker, это смешно. - person John Smith; 02.09.2013
comment
@JohnSmith Вы читали учебник? что ссылка находится в HERE.. Напишите, что вы пробовали, и мы поможем вам - person nachokk; 02.09.2013
comment
Я прочитал учебник, вчера я очень устал. Сегодня проверю еще раз, спасибо большое. - person John Smith; 02.09.2013

SwingWorker — это способ сделать это: http://java.dzone.com/articles/multi-threading-java-swing, но использовать его довольно сложно.

Другим вариантом является очень маленькая платформа под названием Foxtrot: http://foxtrot.sourceforge.net/docs/.

person Hans    schedule 01.09.2013