【问题标题】:Using swingworker to update a JProgressBar during download在下载过程中使用 swingworker 更新 JProgressBar
【发布时间】:2012-07-20 14:28:37
【问题描述】:

问题解决了!!!!!! 非常感谢垃圾神和 HoverCraftFullOfEels!我终于通过使用下面的示例并稍微改变它来了解这个概念。更改允许缩放进度条(默认为 100 个单位)。 再次感谢您的耐心和愿意解决这个问题。意味着很多人, ~凯特

ps - 全方位 +1 :)

/** @see http://stackoverflow.com/questions/4637215 */
public class Threading_01 extends JFrame {

private static final String s = "0.00";
private JProgressBar progressBar = new JProgressBar(0, 100);
private JLabel label = new JLabel(s, JLabel.CENTER);

public Threading_01() {
    this.setLayout(new GridLayout(0, 1));
    this.setTitle("√2");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.add(progressBar);
    this.add(label);
    this.setSize(161, 100);
    this.setLocationRelativeTo(null);
    this.setVisible(true);
}

public void runCalc() {
//    progressBar.setIndeterminate(true);
    TwoWorker task = new TwoWorker();
    task.addPropertyChangeListener(new PropertyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent e) {
            if ("progress".equals(e.getPropertyName())) {
                progressBar.setIndeterminate(false);
                progressBar.setValue((Integer) e.getNewValue());
                System.out.println("**: " + e.getNewValue());
            }
        }
    });
    task.execute();
}

private class TwoWorker extends SwingWorker<Double, Double> {

    private static final int N = 734;
    private final DecimalFormat df = new DecimalFormat(s);

    @Override
    protected Double doInBackground() throws Exception {
        int cntr = 1; //
        double d1;
        double d2;
        double d3;
        for (int i = 0; i <=N; i++) {   
            d1 = N;
            d2 = i;
            d3 = d2/d1;
            d3 = d3 * 100;
            System.out.println(i + "++ " + d3);
            if(d3 >= cntr){
                System.out.println(i + "UPDATE");
                cntr++;
                setProgress(cntr);
                publish(Double.valueOf(cntr));
                Thread.sleep(250); // simulate latency
            }
        }
        return Double.valueOf(0);
    }

    @Override
    protected void process(List<Double> chunks) {
        for (double d : chunks) {
            label.setText(df.format(d));
            System.out.println(": " + d);
        }
    }
}

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            Threading_01 t = new Threading_01();
            t.runCalc();
        }
    });
}

}

【问题讨论】:

  • 您能否将您当前的尝试发布为您尝试使用 SwingWorker 的简单可编译和可运行版本,如果可能的话,最好是 sscce?要么就是这样,要么详细说明你卡在哪里,因为我从上面得到的只是你完全卡在了所有东西上。如果是这种情况,那么您需要重新查看教程。但无论哪种方式,请让我们知道!
  • 其他示例链接(我的!)包括this onethis other one
  • @HFoE 的example 说明了工人如何扩展其对observer pattern 的使用;两者都+1。您可能需要改编他或我引用的examples 之一来构建您的sscce
  • 我有 1+ 个垃圾神的例子,但我早就做过了。 :( 两者都很棒。
  • 我将尝试在一个摇摆工人身上更新代码。我正在考虑通过创建一个在将电子邮件写入磁盘时处理 I/O 的摇摆工作器来稍微重新设计它。如果说类是 376 行代码,你还想要它吗? (是的,我会按照 sscce 修剪不必要的部分:)

标签: java multithreading swing swingworker jprogressbar


【解决方案1】:

更新进度条通常在PropertyChangeListener 中处理,如图here。另请参阅相关的example。如果您的工作人员以后可以提供更明确的进展,则调用 setIndeterminate(true) 是一个合理的初始设置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 2014-09-10
    相关资源
    最近更新 更多