1

forループを含む簡単なコードがあります。ループの各パスで、JProgressBar をインクリメントする必要があります。ただし、これは機能していません。下記参照:

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では何も起こりません。

4

2 に答える 2

0

for ステートメントの前にスレッドを追加してみてください。うまくいくことを願っています

    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();
于 2013-10-08T18:34:48.653 に答える
0

SwingWorkerこれは、実装によって簡単に管理できるはずです。SwingWorkers は、「何かをする」必要があるが、実行中に GUI をブロックしたくない場合に役立ちます。このクラスは、メソッドを介して他の作業を行っている間に GUI コンポーネントを更新する必要がある場合に、EDT に通信するための便利な API も提供しますpublish()/process()

以下の実装では、EDT (GUI スレッド) をブロックしないように、ワーカー スレッドでループを処理します。への呼び出しは、JProgressBar を更新する場所publish(Integer...)への呼び出しとして EDT に中継されprocess(List)ます。これは、すべての Swing コンポーネントと同様に、EDT で JProgressBar のみを更新する必要があるためです。

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();
于 2013-10-08T19:09:24.647 に答える