Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新两个JProgressBar_Java_Multithreading_Swing_Swingworker_Jprogressbar - Fatal编程技术网

Java 更新两个JProgressBar

Java 更新两个JProgressBar,java,multithreading,swing,swingworker,jprogressbar,Java,Multithreading,Swing,Swingworker,Jprogressbar,我用一个JProgressBar做了这个。如何更新两个单独的进度条?我正在doInBackground()worker线程/swingworker方法中执行下载。我想更新两个条,第一个是总计,第二个是总计的一部分。例如,21/100//total 21/50/一半 我已经问了一个问题,终于弄明白了这个问题。可以说,我现在希望提高赌注,让两个progressbars开始。谢谢你的阅读, ~Kyte您可以在更新“部分”进度时触发新的属性更改事件,从而利用属性更改支持 根据您掌握的信息,您可以通过多种

我用一个JProgressBar做了这个。如何更新两个单独的进度条?我正在doInBackground()worker线程/swingworker方法中执行下载。我想更新两个条,第一个是总计,第二个是总计的一部分。例如,21/100//total 21/50/一半

我已经问了一个问题,终于弄明白了这个问题。可以说,我现在希望提高赌注,让两个progressbars开始。谢谢你的阅读,
~Kyte

您可以在更新“部分”进度时触发新的属性更改事件,从而利用属性更改支持

根据您掌握的信息,您可以通过多种方式实现

你可以直接用这样的方式来称呼它

firePropertyChange("sectionProgress", oldProgress, newProgress);
现在很明显,您遇到了可怕的ETD同步问题,因为
firePropertyChange
方法不是线程安全的

但是您可以创建一个简单的
更新程序
类,在
SwingWorker
中实现
可运行

private class TwoWorker extends SwingWorker<Double, Double> {

    protected Double doInBackGround() throws Exception {

        //... Do some work

        SwingUtilities.invokeLater(new Updater(oldProgress, newProgress));

    }

    public class Updater implements Runnable {

        private int oldProgress;
        private int newProgress;

        public Updater(int oldProgress, int newProgress) {
            this.oldProgress = oldProgress;
            this.newProgress = newProgress;
        }

        public void run() {
            firePropertyChange("sectionProgress", oldProgress, newProgress);
        }   

    }

}
私有类TwoWorker扩展SwingWorker{
受保护的Double doInBackGround()引发异常{
//…做些工作
invokeLater(新更新程序(oldProgress,newProgress));
}
公共类更新程序实现Runnable{
私人发展;
私营部门的新进展;
公共更新程序(intoldprogress,intnewprogress){
this.oldProgress=oldProgress;
this.newProgress=newProgress;
}
公开募捐{
FireProperty变更(“分段进度”、旧进度、新进度);
}   
}
}

您可以利用
SwingWorker
类型参数
V
,该参数用于在
发布
过程
方法中执行中间结果。例如:

class DownloadProgress {
    private int totalProgress;
    private int currentTaskProgress;

    public DownloadProgress(int totalProgress, int currentTaskProgress) {
        this.totalProgress = totalProgress;
        this.currentTaskProgress = currentTaskProgress;
    }
}

public class DownloadWorker extends SwingWorker<Double, DownloadProgress> {

    @Override
    protected Double doInBackground() throws Exception {
        ...
        publish(new DownloadProgress(1, 50));
    }

    @Override
    protected void process(List<DownloadProgress> progressList) {
        for (DownloadProgress p : progressList){
            //update progress bars
        }
    }
}
类下载进度{
私人发展;
私营部门的进展情况;
公共下载进度(int totalProgress、int currentTaskProgress){
this.totalProgress=totalProgress;
this.currentTaskProgress=currentTaskProgress;
}
}
公共类DownloadWorker扩展SwingWorker{
@凌驾
受保护的Double doInBackground()引发异常{
...
发布(新下载进度(1,50));
}
@凌驾
受保护的无效进程(列表进程列表){
对于(下载进度p:progressList){
//更新进度条
}
}
}
这里有一个简单的例子(@Max已经说过了):

import java.awt.*;
导入java.awt.event.*;
导入java.util.List;
导入java.util.Random;
导入javax.swing.*;
公共二级酒吧{
私有最终JTextArea=新JTextArea();
私有最终JPanel状态面板=新JPanel(新边界布局(0,2));
私有最终JButton runButton=newjbutton(newrunaction());
私人荡秋千工人;
公共JComponent makeUI(){
区域设置可编辑(假);
JPanel p=新JPanel(新边界布局(5,5));
p、 添加(新的JScrollPane(区域));
p、 添加(runButton,BorderLayout.NORTH);
p、 添加(statusPanel,BorderLayout.SOUTH);
p、 setboorder(BorderFactory.createEmptyByOrder(5,5,5,5));
返回p;
}
类RunAction扩展了AbstractAction{
公共运行操作(){
超级(“运行”);
}
@覆盖已执行的公共无效操作(ActionEvent evt){
最终JProgressBar1=新JProgressBar();
最终JProgressBar 2=新JProgressBar();
runButton.setEnabled(false);
statusPanel.add(bar1,BorderLayout.NORTH);
statusPanel.add(bar2,BorderLayout.SOUTH);
statusPanel.revalidate();
工人=新的SwingWorker(){
@重写公共字符串doInBackground(){
int电流=0;
int lengthOfTask=12;//filelist.size();
发布(新下载进度(Target.LOG,“任务长度:+lengthOfTask”);
发布(新的下载进度(Target.LOG,“\n-------------------\n”);

而(当前你可以走裸机路线:

无论何时需要更新,请执行以下操作:

EventQueue.invokeLater(new Runnable(){
    public void run(){
        firstProgressBar.setValue(someInt);
        secondProgressBar.setValue(someOtherInt);
    }
});
这更新了一个
JTable
中的多个条。鉴于我如何设置我的类,这是最快(也是最可靠)的修复方法。感谢所有发表评论的人!
EventQueue.invokeLater(new Runnable(){
    public void run(){
        firstProgressBar.setValue(someInt);
        secondProgressBar.setValue(someOtherInt);
    }
});