Java SwingWorker done()方法似乎未调用?但SwingWork也未被取消或阻止,未使用发布/处理方法

Java SwingWorker done()方法似乎未调用?但SwingWork也未被取消或阻止,未使用发布/处理方法,java,multithreading,user-interface,swingworker,windowbuilder,Java,Multithreading,User Interface,Swingworker,Windowbuilder,我的问题:为什么我的SwingWorker(它似乎只是在线程中执行我的工具,并从doInBackground()方法(不使用cancel()SwingWorker方法)中正常退出)没有调用done()方法,以便在doInBackground()中完成工具时可以清理我的进度条和标签 我对SwingWorkers很陌生,但我很快就学会了,当需要运行线程化进程并更新GUI时,它们非常有意义。当我需要在类似向导的GUI中添加进度条时,我最终找到了SwingWork类。GUI从用户那里收集一些数据,然后运

我的问题:为什么我的SwingWorker(它似乎只是在线程中执行我的工具,并从doInBackground()方法(不使用cancel()SwingWorker方法)中正常退出)没有调用done()方法,以便在doInBackground()中完成工具时可以清理我的进度条和标签

我对SwingWorkers很陌生,但我很快就学会了,当需要运行线程化进程并更新GUI时,它们非常有意义。当我需要在类似向导的GUI中添加进度条时,我最终找到了SwingWork类。GUI从用户那里收集一些数据,然后运行一个我已经测试过的工具,并基于该数据处理一个文件

我有一个基本的SwingWorker调用我的工具(从它自己的线程调用):

我的下一个想法是,可能是因为我实际上在我的actionPerformed()方法中初始化并执行了SwingWork任务,done()方法出于某种原因没有找到EDT。但这个问题的名称与我自己的问题非常相似,它有一个从changeListener()内部调用SwingWorker的示例。回答者说changeListener()是EDT的一部分。我还没有在GUI中使用changeListener,但我认为这意味着我可以从actionPerformed方法内部创建和调用task_deid

现在,这些代码片段嵌套在我用Eclipse Window Builder工具创建的一个名为GUI的完整类中。本课程的要点是:

public class GUI {
private JFrame frmToolWizard;
private JPanel panel_Steps;
...
private JPanel panel_runDeIDTool_23;

...
private JButton btnStartDeidentification;
private JProgressBar progressBar_deid;
private JLabel lblProgress_deid;
...
private DeIDTask task_deid;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GUI window = new GUI();
                window.frmToolWizard.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public GUI() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmToolWizard = new JFrame();
    ...
    panel_Steps = new JPanel();
    frmToolWizard.getContentPane().add(panel_Steps);
    ...
    panel_runDeIDTool_23 = new JPanel();
    panel_Steps.add(panel_runDeIDTool_23, "name_1406678727369229000");
    ...
    // Lot of other components here
    ...
    btnStartDeidentification = new JButton("Start De-Identification");
    ...
}
private class DeIDTask extends SwingWorker<Void, Void> {
...
}
公共类GUI{
私有JFrame frmToolWizard;
私人JPanel面板_步骤;
...
私人JPanel panel_runDeIDTool_23;
...
私人JButton btnStartDeidentification;
私人JProgressBar progressBar_deid;
私人JLabel lblProgress_deid;
...
专用设计任务任务\u deid;
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
GUI窗口=新建GUI();
window.frmToolWizard.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
}
/**
*创建应用程序。
*/
公共图形用户界面(){
初始化();
}
/**
*初始化框架的内容。
*/
私有void初始化(){
frmToolWizard=newjframe();
...
panel_Steps=new JPanel();
frmToolWizard.getContentPane().add(面板步骤);
...
panel_runDeIDTool_23=新JPanel();
面板步骤。添加(面板运行工具23,“名称”1406678727369229000);
...
//这里有很多其他的组件
...
btnStartDeidentification=新的JButton(“开始取消标识”);
...
}
私有类DeIDTask扩展SwingWorker{
...
}
}

调用done()方法的关键是我要完成进度条,将其设置为空,并将进度条下的标签设置为“done”,这样最终用户就知道他们可以继续了。我想做的所有这些都可以在DeIDTask done()方法中清楚地看到

非常感谢您的帮助。如果这是一个明显的答案,我提前道歉,因为我不知道我需要做什么来解决我的问题。

isDone()
doInBackground()
之后被调用,但在
isDone()完成后,您会收到一个属性更改事件
由于您的侦听器覆盖了您在
isDone()中修改的几乎所有UI属性,因此得出的结论是错误的

propertychangevent
s是针对不同的属性发送的,最明显的是针对
进度
状态
。调用
isDone
后,您收到的最后一个事件是告诉您
SwingWorker
state
属性从
start
变为
DONE


您可以检查
属性更改事件的属性
以区分
进度
状态
的更改。

很抱歉,粘贴时我愚蠢地漏掉了代码的起始行。当我读到你的答案时,我很困惑,因为之前的线程正在运行!就我所知,doInBackground()方法肯定已经完成。对于这个愚蠢的错误,我深表歉意,请不要让它阻止你。另外,我将该工具放在另一个线程中,这样当线程尝试加入时,我可以进行进度更新,正如你在上面粘贴的代码中所看到的,如果我只是调用该线程调用的方法doInBackground()只需在该方法上运行,而无需停止更新TaskDeID进度。仍然存在大括号不匹配的问题。不要把问题拼凑在一起,发布一个能够重现问题的代码!如果您复制这样一个工作示例,任意行不可能消失。很抱歉,我试图缩短整个工作代码,事后看来这是没有帮助的。整个方法已全部重新发布。您会注意到现在在doInBackground()方法中调用并运行了另一个线程。感谢您的耐心。还有一个问题:您是否真的验证了是否未调用
isDone()
,或者您只是根据视觉结果进行假设?我猜您在调用
isDone()
之后会收到一个属性更改事件,并且由于您的侦听器覆盖了您在
isDone()
中修改的几乎所有UI属性,因此得出了错误的结论。
btnStartDeidentification = new JButton("Start De-Identification");
    btnStartDeidentification.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // Disable clicking of the button
            progressBar_deid.setIndeterminate(true);
            btnStartDeidentification.setEnabled(false);

            task_deid = new DeIDTask(deidentifier);
            task_deid.addPropertyChangeListener(new PropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    int progress = task_deid.getProgress();
                    System.out.println("Progress is: " + progress);
                    progressBar_deid.setIndeterminate(false); 
                    progressBar_deid.setString(null);
                    progressBar_deid.setValue(progress);
                    progressBar_deid.setStringPainted(true);
                    lblProgress_deid.setText("Processing Records (Current/Total): " + deidentifier.getCurrentLineNumber() + "/" + deidentifier.getNumberOfLinesInFile());

                }

            });
            task_deid.execute();
        }
    });

    btnStartDeidentification.setBounds(107, 195, 200, 29);
    panel_runDeIDTool_23.add(btnStartDeidentification);
public class GUI {
private JFrame frmToolWizard;
private JPanel panel_Steps;
...
private JPanel panel_runDeIDTool_23;

...
private JButton btnStartDeidentification;
private JProgressBar progressBar_deid;
private JLabel lblProgress_deid;
...
private DeIDTask task_deid;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                GUI window = new GUI();
                window.frmToolWizard.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public GUI() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frmToolWizard = new JFrame();
    ...
    panel_Steps = new JPanel();
    frmToolWizard.getContentPane().add(panel_Steps);
    ...
    panel_runDeIDTool_23 = new JPanel();
    panel_Steps.add(panel_runDeIDTool_23, "name_1406678727369229000");
    ...
    // Lot of other components here
    ...
    btnStartDeidentification = new JButton("Start De-Identification");
    ...
}
private class DeIDTask extends SwingWorker<Void, Void> {
...
}