java - SwingWorker 中的进度对话框

标签 java multithreading swing swingworker concurrency

我有一个方法 register() 需要很长时间才能完成。所以我把它放在 swingworker 的 doInBackGround() 中。与此同时,我想显示模态对话框,并且上面有不确定的进度条。

private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {                                                  
    // TODO add your handling code here:
    WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
    dialog.addWindowListener(new java.awt.event.WindowAdapter() {


    });
    dialog.setVisible(true);
    SwingWorker worker = new SwingWorker() {

        @Override
        protected Object doInBackground() throws Exception {
            register();
            return 0;
        }
    };
    dialog.dispose();   
}

但是一切都卡住了。在调试器中我看到 regester() 没有被调用。我哪里搞砸了?任何帮助将不胜感激!谢谢!

最佳答案

模态对话框上调用setVisible(true)后调用dialog.dispose,因此可能永远不会调用dispose。相反,在 SwingWorker 中的完成重写中调用 dispose,并在调用对话框上的 setVisible(true) 之前在 SwingWorker 上调用执行。

类似这样的东西(警告,代码未测试):

private void registerPopupItemActionPerformed(java.awt.event.ActionEvent evt) {                                                  

    WaitDialog dialog = new WaitDialog(new javax.swing.JFrame(), true);
    dialog.addWindowListener(new java.awt.event.WindowAdapter() {

    });
    SwingWorker worker = new SwingWorker() {

        @Override
        protected Object doInBackground() throws Exception {
            register();
            return 0;
        }

        @Override
        protected void done() {
            dialog.dispose();
        }
    };
    worker.execute();
    dialog.setVisible(true);
}

关于java - SwingWorker 中的进度对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8121621/

相关文章:

java - 检查 Java 中所有文件句柄何时被释放

java - 如何在 Java Lettuce 中运行 Redis 原始命令?

c++ - 数据竞赛?段错误,但是问题出在哪里呢?

c - 如何在内核源代码中设置断点以获取 fork.c 中函数的地址?

Java Swing 注册到事件类型

java - 小工具中的Logback+Swing

java - 如何在java 8中groupingBy之后仅从对象中提取ID

android - Java - 安卓 : Thread being called (run) twice

java - 单击时尝试更改 JButton 上的图标

java - Derby 嵌入式数据库创建表结构