gpt4 book ai didi

java - 如何在 Java 中使用 SwingWorker?

转载 作者:行者123 更新时间:2023-12-01 21:35:08 25 4
gpt4 key购买 nike

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

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

任何人都可以解释如何使用 SwingWorker 来处理我的代码片段和/或为我指出一个像样的教程吗?我已经看过了,但我不确定我是否理解。

最佳答案

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

在事件调度线程 (EDT) 上运行长时间运行的任务可能会导致 GUI 锁定,因此所做的事情之一是使用 SwingUtilities.invokeLaterinvokeAndWait它通过在运行所需任务之前优先考虑其他 AWT 事件(以 Runnable 的形式)来保持 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 的第一个类型,第二个类型为 type用于返回 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/58804908/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com