Java 在下载期间使用swingworker更新JProgressBar

Java 在下载期间使用swingworker更新JProgressBar,java,multithreading,swing,swingworker,jprogressbar,Java,Multithreading,Swing,Swingworker,Jprogressbar,问题解决了!!!!!! 非常感谢垃圾神和飞天精灵!通过使用下面的示例并稍微修改,我最终得到了这个概念。更改允许缩放进度条(默认为100个单位)。 再次感谢您的耐心和意愿来解决这个问题。意味着很多人, ~z~凯尔特 ps-+1全面性:) /**@请参见http://stackoverflow.com/questions/4637215 */ 公共类线程_01扩展JFrame{ 私有静态最终字符串s=“0.00”; 私有JProgressBar progressBar=新的JProgressBar(

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

ps-+1全面性:)

/**@请参见http://stackoverflow.com/questions/4637215 */
公共类线程_01扩展JFrame{
私有静态最终字符串s=“0.00”;
私有JProgressBar progressBar=新的JProgressBar(0,100);
专用JLabel标签=新JLabel(s,JLabel.CENTER);
公共图书馆(01){
这个.setLayout(新的GridLayout(0,1));
此.setTitle(“√2");
此.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
添加(progressBar);
添加(标签);
这个。设置大小(161100);
此.setLocationRelativeTo(空);
此.setVisible(true);
}
public void runCalc(){
//progressBar.SetUndeterminate(真);
TwoWorker任务=新TwoWorker();
task.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共无效属性更改(属性更改事件e){
如果(“progress”.equals(例如getPropertyName())){
progressBar.SetUndeterminate(假);
progressBar.setValue((整数)e.getNewValue());
System.out.println(“**:”+e.getNewValue());
}
}
});
task.execute();
}
私有类TwoWorker扩展SwingWorker{
专用静态最终整数N=734;
专用最终决策格式df=新决策格式;
@凌驾
受保护的Double doInBackground()引发异常{
int-cntr=1//
双d1;
双d2;
双d3;
对于(int i=0;i=cntr){
System.out.println(i+“更新”);
cntr++;
setProgress(cntr);
出版(双重价值(cntr));
Thread.sleep(250);//模拟延迟
}
}
返回Double.valueOf(0);
}
@凌驾
受保护的无效进程(列表块){
for(双d:块){
label.setText(df.format(d));
System.out.println(“:”+d);
}
}
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
螺纹_01 t=新螺纹_01();
t、 runCalc();
}
});
}

}

更新进度条通常在
PropertyChangeListener
中处理,如图所示。另见本节相关内容。调用
setUndefinate(true)
是一个合理的初始设置,如果您的工作人员以后可以提供更明确的进度。

您是否可以发布您当前尝试的简单可编译和可运行版本,以完成您尝试使用SwingWorker的操作,如果可能,最好是使用SwingWorker?要么是这样,要么是深入到你到底被困在哪里的重要细节,因为我从上面得到的是,你完全被困在所有事情上。如果是这样,那么您需要重新阅读教程。但不管怎样,请让我们知道!到示例(我的!)的其他链接包括和。@HFoE说明了工人如何扩展其对的使用+两个都是1。你可能想修改他或我引用的其中一个来构建你的。我想1+扔掉上帝的例子,但我很久以前就已经这么做了(两者都很好。我将尝试使用swing worker来更新代码。我正在考虑通过创建一个swing worker来稍微重新设计它,该swing worker将在电子邮件写入磁盘时处理I/O。如果类是376行左右的代码,您仍然想要它吗?(是的,我将按照sscce的要求修剪不必要的零件:)
/** @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();
        }
    });
}