SwingWorker doInBackground正在执行时的用户输入

时间:2013-10-28 11:30:33

标签: java swing swingworker

我正在使用SwingWorker在后台执行某些操作。在执行期间,我有一个条件,我需要通过抛出JoptionPane.showOptionDialog()来询问用户的事情。 我不希望在我的模型类中执行此操作,并且在执行SwingWorker.doInBackground时不想这样做。

我相信很多人都面临过这个问题。

所以我必须从调用doInBackground返回,然后在done()中请求用户输入。然后我需要启动另一个SwingWorker并从done方法执行doInBackground()?

还有另一种更简洁/更简单的方法吗?

更新(针对mkorbel的问题)

班级设计是这样的:

public class OptionInSwingWorker {

    public static void main(String[] args) {
        JFrame frame=new JFrame();
        JButton test = new JButton("Test");
        frame.add(test);

        test.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new SwingWorker<Void,Void>(){
                    @Override
                    protected Void doInBackground() throws Exception {
                        // check for a value in the database

                        // if value is something.. throw up an OptionPane
                        // and ask the user a question..
                        // then do something...
                        return null; 
                    }


                    @Override
                    protected void done() {
                        // open some other dialog
                    }
                }.execute();
            }
        });

    }
}

1 个答案:

答案 0 :(得分:4)

进行SwingUtilities.invokeLater调用以执行提示并将结果返回给SwingWorker。如果可能的话,让SwingWorker继续运行,否则只需让它循环并等待它检查响应。

这样您就不必在以后返回并启动新的SwingWorker。虽然,根据你的工作,开始一个新的SwingerWorker可能实际上更清洁,更清晰。