SwingWorker中的进度对话框

bun*_*112 2 java concurrency swing multithreading swingworker

我有一个方法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();   
}
Run Code Online (Sandbox Code Playgroud)

但是一切都冻结了.在调试器中,我看到没有调用regester().我搞砸了哪里?任何帮助都会受到欢迎!谢谢 !

Hov*_*els 5

模式对话框上调用setVisible(true)后调用dialog.dispose ,因此可能永远不会调用dispose.而是在SwingWorker中的done覆盖中调用dispose,并在对话框上调用setVisible(true)之前调用SwingWorker上的execute .

像这样的东西(警告,代码没有测试):

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);
}
Run Code Online (Sandbox Code Playgroud)