1

У меня есть простой код с петлей for. В каждом проходе цикла я должен увеличивать JProgressBar; однако это не работает. Смотрите ниже:нить в Java Swing не работает

public void atualizarBarraDeProgresso(final int valorGeral, final int valorAtual) { 
    Thread threadProgressoCarregamento = new Thread() { 
     @Override 
     public void run() { 
      jProgressBarPersistindo.setValue(valorAtual); 
     } 
    }; 
    threadProgressoCarregamento.start(); 
} 

Я вызываю метод "atualizarBarraDeProgresso" в петле, как показано ниже:

progressBar.setMinimum(0); 
progressBar.setMaximum(qtd); 
for(int i = 0; i < qtd; i++) { 
    atualizarBarraDeProgresso(qtd, i + 1); 
    doSomething(); 
} 

Но ничего не происходит с моим ProgressBar.

+6

ли вы * действительно * хотите, что многие темы? В любом случае, я подозреваю, что проблема заключается в том, что сам цикл * * происходит в ADT (т. Е. В обработчике кликов) и * блокирует взаимодействие Swing UI и обновления до тех пор, пока оно не завершится. Подумайте о том, как использовать [SwingWorker] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html) - использование такого правильного варианта, скорее всего, устранит все проблемы. Кроме того, убедитесь, что * только * обновляет объекты Swing на ADT. – user2246674

+0

Вы вызываете repaint() на содержащий JPanel после того, как вы установили значение в любой точке? Это может быть все, что отсутствует. – Barryrowe

+0

вызовите метод repaint(), и, кстати, решение очень плохое. –

ответ

0

попробуйте добавить нить перед записью. Я надеюсь, что это работает

progressBar.setMinimum(0); 
    progressBar.setMaximum(qtd); 

    new Thread(){ 
     @Override 
     public void run() { 
      for(int i = 0; i < qtd; i++) { 
       atualizarBarraDeProgresso(qtd, i + 1); 
       doSomething(); 
      } 
     } 
    }.start(); 
0

Это должно быть легко управляться с помощью реализации SwingWorker. SwingWorker s полезны, когда вам нужно «что-то делать», но при этом не хотите блокировать графический интерфейс. Класс также дает вам полезный API для связи с EDT, когда вам нужно обновить компонент GUI при выполнении другой работы с помощью методов publish()/process().

Нижеприведенная реализация обрабатывает ваш цикл на рабочем потоке, чтобы он не блокировал EDT (поток GUI). Звонки на publish(Integer...) ретранслируются в EDT как вызов process(List), где вы хотите обновить свой JProgressBar, потому что, как и все компоненты Swing, вы должны обновлять JProgressBar только на EDT.

public class MySwingWorker extends SwingWorker<Void, Integer> { 

    private final int qtd; 
    private final JProgressBar progressBar; 

    public MySwingWorker(JProgressBar progressBar, int qtd){ 
     this.qtd = qtd; 
     this.progressBar = progressBar; 
    } 

    /* This method is called off the EDT so it doesn't block the GUI. */ 
    @Override 
    protected Void doInBackground() throws Exception { 
     for(int i = 0; i < qtd; i++) { 

      /* This sends the arguments to the process(List) method 
      * so they can be handled on the EDT. */ 
      publish(i + 1); 

      /* Do your stuff. */ 
      doSomething(); 
     } 
     return null; 
    } 

    /* This method is called on the EDT in response to a 
    * call to publish(Integer...) */ 
    @Override 
    protected void process(List<Integer> chunks) { 
     progressBar.setValue(chunks.get(chunks.size() - 1)); 
    } 
} 

Вы можете запустить его как этот

int qtd = ...; 

progressBar.setMinimum(0); 
progressBar.setMaximum(qtd); 

SwingWorker<? ,?> worker = new MySwingWorker(progressBar, qtd); 

worker.execute(); 
Смежные вопросы