java - 如何在 Java 中使用 SwingWorker?

标签 java swingworker

Related to my previous question: Call repaint from another class in Java?

我是 Java 新手,我看过一些关于 SwingWorker 的教程。但是,我不确定如何使用我在上一个问题中提供的示例代码来实现它。

谁能解释一下我的代码片段如何使用 SwingWorker 和/或向我指出一个体面的教程?我看过了,但我不确定我是否理解。

最佳答案

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

在事件调度线程 (EDT) 上运行长时间运行的任务可能会导致 GUI 锁定,因此其中一件事是使用 SwingUtilities.invokeLaterinvokeAndWait它通过在运行所需任务(以 Runnable 的形式)之前优先考虑其他 AWT 事件来保持 GUI 响应。

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

Java 教程中有一个关于 SwingWorker 的部分.

这是一个示例,其中 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的第一种类型,第二种类型为用于返回 publishprocess 方法,本例中没有用到。

然后,为了调用 SwingWorker,调用 execute 方法。在这个例子中,我们将一个 ActionListener 连接到一个 JButton 以执行 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);
}

应用程序运行后,将有两个按钮。一个标有“答案!”和另一个“无”。当点击“答案!”按钮,一开始什么都不会发生,但点击“Nothing”按钮会起作用并证明 GUI 是响应式的。

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

关于java - 如何在 Java 中使用 SwingWorker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/782265/

相关文章:

java - 从不属于 ButtonGroup 的 JRadioButton 获取文本

java - 二元或运算符

java - 使用 SwingWorker 移动组件

java - 使用大量并发的 SwingWorker

java - MVC - SwingWorker 具有一个应该更新 View 的长时间运行的进程

java - 在 Java 中重复执行 SwingWorker

java - Swing Worker 模态对话框不会关闭

java - ImageJ API : how to display an image with zoom and drag to scroll features active in the image window?

java - 如果java匿名内部类采用不同的最终参数,如何重用它们?

java I/O,将数组写入文本文件