Java 使用SwingWorker在GUI中添加进度条

Java 使用SwingWorker在GUI中添加进度条,java,multithreading,swing,user-interface,progress-bar,Java,Multithreading,Swing,User Interface,Progress Bar,我使用SwingWorker使用Java Swing API制作进度条 我有一个扩展SwingWorker的类 class Swinger extends SwingWorker { private ClassAnalyzer classAnalyzer; public Swinger(ClassAnalyzer classAnalyzer){ this.classAnalyzer = classAnalyzer; } @Override pu

我使用SwingWorker使用Java Swing API制作进度条

我有一个扩展SwingWorker的类

    class Swinger extends SwingWorker {
private ClassAnalyzer classAnalyzer;

public Swinger(ClassAnalyzer classAnalyzer){
     this.classAnalyzer = classAnalyzer;
}
        @Override
        public Void doInBackground() throws InterruptedException {

            try
        {     
            int progress = 0;
            while (progress < 100) {

 // at this point I make certain elaboration on classAnalyzer                 

                progress++;

                //Call the process method to update the GUI
                publish(progress);

            }                       
        }
        catch(InterruptedException e)
        {
        }
        return null;
    }

    @Override
    protected void process(List chunks) {
     for (Integer chunk : chunks) {
        progressBar.setValue(chunk);

        //if the switchtype checkbox is selected then
        //change the progressbar to a determined type
        //once the progress has reached 50
        if (chunk > 49)
        {
            if (switchType.isEnabled() && switchType.isSelected())
            {
                progressBar.setStringPainted(true);

            }

        }
     }
 }

}
当我在测试仪中启动第二个类时,在进度条出现之前会显示消息“methods not found”(方法未找到),而我希望消息会出现以防万一
之后做什么?

SwingWorker类还定义了一个方法,您可以在其中定义任务完成后要做什么

类Swinger扩展SwingWorker{
//所有其他代码^^
@凌驾
受保护的void done(){
if(this.classAnalyzer.getNumberOfMethods()==0)
showMessageDialog(null,“未找到方法”);
}
}

您不必担心线程问题,因为此方法也在EDT上调用。

SwingWorker类还定义了一个方法,您可以在其中定义任务完成后要执行的操作

类Swinger扩展SwingWorker{
//所有其他代码^^
@凌驾
受保护的void done(){
if(this.classAnalyzer.getNumberOfMethods()==0)
showMessageDialog(null,“未找到方法”);
}
}
您不必担心线程问题,因为此方法也在EDT上调用。

task.execute()
将启动后台(在后台调用
doInBackground
方法),程序将继续执行

task.execute()
不是阻塞方法,这就是使用它的原因,因此您不会阻塞事件分派线程

您可以使用
PropertyChangeListener

final ClassAnalyzer c = new ClassAnalyzer();
Swinger task = new Swinger(c);
task.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("state") && evt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
            int methods = c.getNumberOfMethods();

            if(methods == 0){
                JOptionPane.showMessageDialogo(null, "methods not found");
            }
        }
    }
});
task.execute();
task.execute()
将启动一个后台(其中将调用
doInBackground
方法),程序将继续执行

task.execute()
不是阻塞方法,这就是使用它的原因,因此您不会阻塞事件分派线程

您可以使用
PropertyChangeListener

final ClassAnalyzer c = new ClassAnalyzer();
Swinger task = new Swinger(c);
task.addPropertyChangeListener(new PropertyChangeListener() {
    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        if (evt.getPropertyName().equals("state") && evt.getNewValue().equals(SwingWorker.StateValue.DONE)) {
            int methods = c.getNumberOfMethods();

            if(methods == 0){
                JOptionPane.showMessageDialogo(null, "methods not found");
            }
        }
    }
});
task.execute();

你的另一个问题是另一个问题。不管你的第二个问题是什么,你都应该接受张贴在这里的其中一个答案。你的另一个问题是另一个问题。不管你的第二个问题是什么,你都应该接受张贴在这里的答案之一。