1

加重ランダム整数に基づいて ProgressBar と JLabel ベースを更新する小さな関数を作成しています。スレッドは正常にスリープしており、ランダムな値が取得されていますが、進行状況バーと jlabel が更新されていません。

また、GUI が応答しなくなります。GUI が完全にロックされているわけではありません (ボタンをクリックすることはできますが、それらのボタンに関連付けられた機能は実行されません)。

run() メソッドで print ステートメントをスローしても、出力されません。なので絶対に入らないと思います。

これまでの私の方法は次のとおりです。

private void updateProgressBar(int max) {
    final int maxDiamonds = max;
    int i = 0;
    while(i <= max) {
        //get random obstacle found
        final Obstacle o = obstacle.next();
        System.out.println("Obstacle: " + o.getName());
        //get random number of diamonds for obstacle
        int numDiamonds = Integer.parseInt(numFoundDiamonds.next());
        System.out.println("Number of Diamonds: " + numDiamonds);
        //set currentValue for the progress bar
        final int currentValue = i;

        for(int j = o.getRemovalTime(); j >= 0; j--) {
            final int rSecs = j;
            System.out.println("Time remaining to remove: " + rSecs);
            try {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        progressBar.setString(currentValue + "/" + maxDiamonds);
                        statusLabel.setText("Found " + o.getName() + ". Removing: " + rSecs + " s Remaining.");
                    }
                });
                java.lang.Thread.sleep(1000);
            } catch (InterruptedException e) {
                JOptionPane.showMessageDialog(this, e.getMessage());
            }
        }
        i += numDiamonds;  
    }

}

おそらく私は単純なものを見落としています。

使用されている他のクラスに関するコードをさらに提供することもできますが、問題は提供されたコードにあると感じています。

4

1 に答える 1

3

Thread.sleep(...)Swing スレッド全体とアプリケーションをスリープ状態にする Swing イベント スレッドを呼び出しています。SwingWorker などのバックグラウンド スレッドを使用します。

于 2013-07-31T16:28:03.620 に答える