java - SwingWorker doInBackground() 不起作用

标签 java concurrency joptionpane swingworker

我试图在数据库上执行一些任务时显示进度条。但是,进度栏卡住,并且我想在数据库上执行的操作未执行。据我了解,为了保证 Swing 中的正确并发性,我需要在辅助线程上执行数据库任务。我也明白我的错误与 JOptionPane 有关。但我无法想出解决方案来解决它。这是我的进度对话框的代码:

public class ProgressDialog extends JDialog {
/**
 * 
 */
    private static final long serialVersionUID = 1L;

    public ProgressDialog() {

        setModal(true);
        setTitle("Fortschritt");
        setSize(200, 100);
        setDefaultCloseOperation(DISPOSE_ON_CLOSE);

        JProgressBar pb = new JProgressBar();
        pb.setIndeterminate(true);
        pb.setValue(0);
        add(pb);

        setVisible(true);
   }
}

这是我调用此构造函数的代码:

int result = JOptionPane.showConfirmDialog(GUIAutoTest.jtable,
    "Schaden mit Testkonfig = " + index + " anlegen ?", "Bestätigen",
    JOptionPane.YES_NO_OPTION);

if (result == JOptionPane.YES_OPTION) {
new SwingWorker<Void, Void>() {
    final  ProgressDialog pd = new ProgressDialog();
    @Override
    protected Void doInBackground() throws Exception {
        InitTestLauf itl;
        try {
            itl = new InitTestLauf(index);
            StartTestLauf stl = new StartTestLauf(itl.getIdTstLauf());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void done() {
        System.out.println("done");
        pd.setVisible(false);
    }
}.execute();

JOptionPane.showMessageDialog(GUIAutoTest.jtable,
        "Schaden angelegt. " + "Schadennummer: " + StartTestLauf.getSchadenNr(),
        "Schaden angelegt", JOptionPane.PLAIN_MESSAGE);

没关系,doInBackground() block 内部发生了什么,甚至System.out.println("print some")也不起作用。我的错误在哪里?

提前致谢!

最佳答案

我制作了一个使用进度条、对话框和 swingworker 的示例。

import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
import java.util.List;

/**
 * Created on 13.06.17.
 */
public class DialogJunker {
    static class ProgressDialog extends JDialog {
        JProgressBar bar;
        ProgressDialog(){
            setModal(true);
            bar = new JProgressBar();
            add(bar);
            pack();
        }
        void setProgress(int i){
            bar.setValue(i);
        }
    }
    public static void main(String[] args){

        JFrame frame = new JFrame("diddly dialog");
        JButton button = new JButton("start");
        button.addActionListener(evt->{
            ProgressDialog log = new ProgressDialog();

            new SwingWorker<Void, Integer>(){
                @Override
                public Void doInBackground(){
                    for(int i = 0; i<100; i++){
                        try{
                            Thread.sleep(10);
                            publish(i);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    return null;
                }
                @Override
                public void done(){
                    log.setVisible(false);
                    log.dispose();
                }
                @Override
                protected void process(List<Integer> ints){
                    log.setProgress(ints.get(0));
                }


            }.execute();

            log.setVisible(true);

        });
        frame.add(button);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

    }
}

此示例将显示一个带有更新进度条的对话框,然后在完成后关闭该对话框。

在进一步检查您的代码后,我确实发现了问题。您正在 SwingWorker 类中构造 ProgressDialog,但您将进度对话框设置为可见,这会阻塞。请注意,我已经解决了很多问题。

  • 启动 Swing Worker 后,我将 set 称为可见。
  • 我发布结果,以便对话框真正得到更新。
  • 我保留了对进度条的引用,因此它实际上可以更新。

关于java - SwingWorker doInBackground() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44495884/

相关文章:

java - 碰撞器(java处理)

java - 使用 Restfb 最新版本 1.9.0 获取 OauthException

perl DBI 和准备好的语句名称冲突

PostgreSQL - 让两个事务同时运行

java - 无法在 JOption 对话框中使用 ints 和 sum

java - JOptionPane 怎么禁用X?

java - 如何将对象序列化为 CSV 文件?

java - 我可以确定属于哪个库类吗?

java - Java 中原子集与 volatile 集的区别?

java - 如何使用 JButton 为 ActionEvent 创建 If 语句