您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何在Java中使用SwingWorker?

如何在Java中使用SwingWorker?

通常,SwingWorker用于在Swing中执行长时间运行的任务。

在事件调度线程(EDT)上运行长时间运行的任务可能会导致GUI锁定,因此要做的一件事情是使用SwingUtilities.invokelaterinvokeAndWait保持GUI响应,从而在运行所需任务之前对其他AWT事件进行优先级排序(以的形式Runnable)。

但是,问题SwingUtilities在于它不允许将数据从已执行Runnable方法返回到原始方法。这就是SwingWorker旨在解决的问题。

这是一个示例,其中a SwingWorker用于在单独的线程上执行耗时的任务,并在稍后显示答案的消息框。

首先,SwingWorker将进行类扩展:

class AnswerWorker extends SwingWorker<Integer, Integer>
{
    protected Integer doInBackground() throws Exception
    {
        // Do a time-consuming task.
        Thread.sleep(1000);
        return 42;
    }

    protected void done()
    {
        try
        {
            JOptionPane.showMessageDialog(f, get());
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

doInBackgroundget方法的返回类型指定为的第一种类型,SwingWorker第二种类型是用于publish和process方法返回的类型,本例中未使用。

然后,为了调用SwingWorker,将调用execute方法。在此示例中,我们将钩ActionListenerJButton以执行AnswerWorker

JButton b = new JButton("Answer!");
b.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
        new AnswerWorker().execute();
    }
});

可以将上述按钮添加到中JFrame,然后单击以获取消息框。以下内容可用于初始化Swing应用程序的GUI:

private void makeGUI()
{
    final JFrame f = new JFrame();
    f.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
    f.getContentPane().setLayout(new FlowLayout());

    // include: "class AnswerWorker" code here.
    // include: "JButton" b code here.

    f.getContentPane().add(b);
    f.getContentPane().add(new JButton("Nothing"));
    f.pack();
    f.setVisible(true);
}

运行该应用程序后,将有两个按钮。一个标有“答案!”的标签 还有另一个“没事”。当一个人点击“答案!” 按钮,一开始什么都不会发生,但是单击“无”按钮将起作用,并表明GUI响应。

并且,一秒钟后,的结果AnswerWorker将出现在消息框中。

java 2022/1/1 18:20:33 有481人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶