Java 从单独的类更新JProgressBar

Java 从单独的类更新JProgressBar,java,swing,class,external,updateprogress,Java,Swing,Class,External,Updateprogress,我一直遵循此线程,试图从程序中的单独类更新JProgressBar: 不幸的是,我的代码不能正常工作。我可能错过了什么,但我似乎不知道是什么。这是我迄今为止编写的代码: 以下是我用来更新进度条的propertyChangeListener: PropertyChangeListener listener = new PropertyChangeListener(){ public void propertyChange(PropertyChangeEvent event){

我一直遵循此线程,试图从程序中的单独类更新JProgressBar:

不幸的是,我的代码不能正常工作。我可能错过了什么,但我似乎不知道是什么。这是我迄今为止编写的代码:

以下是我用来更新进度条的propertyChangeListener:

PropertyChangeListener listener = new PropertyChangeListener(){
        public void propertyChange(PropertyChangeEvent event){
            if("progress".equals(event.getPropertyName())){
                progressBar.setValue((int)currentPercent);
                progressBar.setString(Integer.toString((int)currentPercent));
            }
        }
    };
SwingWorker类:

class Task extends SwingWorker<Void, String>{

    public Task(){
        md = new ManipulateDirectories(this);
    }
    @Override
    public Void doInBackground(){
        for(int i = 0; i < directories.length; i++){
            md.copyDirectory(directories[i], backupDir);
        }
        return null;
    }

    @Override
    public void process(List<String> chunks){
    }

    @Override
    public void done(){
        closeWindow();
    }

    public void updateProgress(int tick){
        setProgress(tick);
    }
}
正如您所看到的,propertyChangeListener应该由swingworker类中的updateProgress(int)方法触发,并且该方法应该由以下行调用:
task.updateProgress((int)currentPercent)
,该行位于操纵目录类中。但是,该行似乎没有调用updateProgress()。我猜“Task”的特定实例可能有问题——也许我正在创建一个没有正确上下文的单独实例?(我知道术语可能有点错误,但希望你能理解我的意思)。有人能发现我的错误吗?任何帮助都将不胜感激,我已经在这上面呆了很长一段时间了

SSCCE:

import java.awt.BorderLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import javax.swing.border.EmptyBorder;

public class MainClass extends JFrame {
    private JProgressBar progressBar;
    private DoSomething ds;
    private int currentPercent = 0;
    private Task task;
    private static JPanel contentPane;
    private JPanel bottomPane;
    private JButton btnCancel;

    public static void main(String[] args){
        MainClass mc = new MainClass();
        mc.createGUI();
    }
    public void createGUI(){
        //Create frame
        setTitle("Backup Progress");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 350);
        //Create content pane
        contentPane = new JPanel(new BorderLayout());
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        //Create panel for progress bar/cancel button
        bottomPane = new JPanel();
        bottomPane.setLayout(new BoxLayout(bottomPane, BoxLayout.Y_AXIS));

        progressBar = new JProgressBar(0, 100);
        progressBar.setStringPainted(true);
        progressBar.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        progressBar.setValue(0);

        btnCancel = new JButton("Cancel");
        btnCancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                closeWindow();
            }
        });

        bottomPane.add(progressBar);
        bottomPane.add(btnCancel);
        contentPane.add(bottomPane, BorderLayout.SOUTH);

        PropertyChangeListener listener = new PropertyChangeListener(){
            public void propertyChange(PropertyChangeEvent event){
                if("progress".equals(event.getPropertyName())){
                    progressBar.setValue((int)currentPercent);
                    progressBar.setString(Integer.toString((int)currentPercent));
                }
            }
        };

        setVisible(true);
        task = new Task();
        task.execute();
    }

    class Task extends SwingWorker<Void, String>{
        public Task(){
            ds = new DoSomething(this);
        }
        @Override
        public Void doInBackground(){
            for(int i = 0; i < 100; i++){
                ds.incrementPercent();
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }
        @Override
        public void done(){
            closeWindow();
        }
        public void updateProgress(int tick){
            setProgress(currentPercent + tick);
        }
    }

    public class DoSomething{
        Task task;
        public DoSomething(Task task){
            this.task = task;
        }
        public void incrementPercent(){
            task.updateProgress(1);
        }
    }

    public void closeWindow(){
        WindowEvent close = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
        Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(close);
    }
} 
导入java.awt.BorderLayout;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.WindowEvent;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入javax.swing.BorderFactory;
导入javax.swing.BoxLayout;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JProgressBar;
导入javax.swing.SwingWorker;
导入javax.swing.border.EmptyBorder;
公共类MainClass扩展了JFrame{
私人JProgressBar progressBar;
私人剂量计;
私有int currentPercent=0;
私人任务;
私有静态JPanel内容窗格;
私人JPanel底部窗格;
私人JButton btnCancel;
公共静态void main(字符串[]args){
MainClass mc=新的MainClass();
mc.createGUI();
}
public void createGUI(){
//创建框架
setTitle(“备份进度”);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
立根(100100450350);
//创建内容窗格
contentPane=newjpanel(newborderlayout());
setboorder(新的EmptyBorder(5,5,5,5));
setContentPane(contentPane);
//为进度条/取消按钮创建面板
底部窗格=新的JPanel();
bottomPane.setLayout(新的BoxLayout(bottomPane,BoxLayout.Y_轴));
progressBar=新的JProgressBar(01100);
progressBar.SetStringPaint(真);
progressBar.setBorder(BorderFactory.CreateEmptyByOrder(5,5,5,5));
progressBar.setValue(0);
btnCancel=新的JButton(“取消”);
btnCancel.addActionListener(新ActionListener(){
已执行的公共无效操作(操作事件e){
关闭窗口();
}
});
底部窗格。添加(进度条);
底部窗格。添加(btnCancel);
添加(底部窗格,BorderLayout.SOUTH);
PropertyChangeListener侦听器=新建PropertyChangeListener(){
公共作废propertyChange(PropertyChangeEvent事件){
if(“progress”.equals(event.getPropertyName())){
progressBar.setValue((int)currentPercent);
progressBar.setString(Integer.toString((int)currentPercent));
}
}
};
setVisible(真);
任务=新任务();
task.execute();
}
类任务扩展SwingWorker{
公共任务(){
ds=新剂量(本);
}
@凌驾
公共无效doInBackground(){
对于(int i=0;i<100;i++){
ds.incrementPercent();
试一试{
睡眠(1000);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
返回null;
}
@凌驾
公众假期结束(){
关闭窗口();
}
public void updateProgress(int tick){
设置进度(当前百分比+勾号);
}
}
公共级剂量测量{
任务;
公共剂量测量(任务){
this.task=任务;
}
公共无效增量百分比(){
任务更新进程(1);
}
}
公共无效关闭窗口(){
WindowEvent close=新的WindowEvent(这是WindowEvent.WINDOW\u CLOSING);
Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(关闭);
}
} 

我知道这是一个很长的SSCCE,但希望它能给你所有你需要知道的信息。

你永远不会把你的监听器添加到你的
SwingWorker

改为:

task = new Task();
task.addPropertyChangeListener(listener);
另一个错误是,您从未在
updateProgress
中更新
currentPercent

public void updateProgress(int tick){
            currentPercent+=tick;
            setProgress(currentPercent);
}
编辑

实际上,代码中的错误是相同的(不是sscce),您从不更新
currentPercent

PropertyChangeListener listener = new PropertyChangeListener(){
            public void propertyChange(PropertyChangeEvent event){
                if("progress".equals(event.getPropertyName())){
                    currentPercent = (int)event.getNewValue();
                    progressBar.setValue(currentPercent);
                    progressBar.setString(Integer.toString(currentPercent));
                }
            }
        };

很抱歉,我从未注意到添加了swing标签。从现在起我会记住的。我马上就准备好一个快速的SSCCE。
1%
等于什么,什么是
currentSize
currentPercent
声明为?你的代码片段真的毫无意义,因为它没有足够的描述你正在做的事情来提供帮助…哎呀,我忘了包括这一点。我最初用一个变量“totalSize”调用这个类,它是一组目录的总大小。百分之一是totalSize/100,它给出了进度条增加1%所需的大小。CurrentSize是已复制文件的大小之和,只要它小于1%。CurrentPercent是应显示在进度条上的总百分比。希望这是有意义的。@AndrewThompson,SSCCE已经添加,尽管它更长
PropertyChangeListener listener = new PropertyChangeListener(){
            public void propertyChange(PropertyChangeEvent event){
                if("progress".equals(event.getPropertyName())){
                    currentPercent = (int)event.getNewValue();
                    progressBar.setValue(currentPercent);
                    progressBar.setString(Integer.toString(currentPercent));
                }
            }
        };