【问题标题】:User input when SwingWorker doInBackground is executingSwingWorker doInBackground 执行时的用户输入
【发布时间】:2013-10-28 11:30:32
【问题描述】:

我正在使用 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();
            }
        });

    }
}

【问题讨论】:

  • 我用来传递 Window 的引用和我用来调用 JOption 的工作线程的正在进行的方法。但这不是一个好主意,如果处理不当,最终会出现很多弹出窗口。使用超时来关闭带有一些默认值的 joption
  • 在执行期间我有一个...,正在谈论来自嵌套 void 的异常或 SwingWorker 执行的类

标签: java swing swingworker


【解决方案1】:

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

这将允许您以后不必返回并启动新的 SwingWorker。不过,根据您所做的工作,开始一个新的 SwingerWorker 实际上可能会更干净、更清晰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多