Related to my previous question: Call repaint from another class in Java?
我是 Java 新手,我看过一些关于 SwingWorker 的教程。但是,我不确定如何使用我在上一个问题中提供的示例代码来实现它。
谁能解释一下我的代码片段如何使用 SwingWorker 和/或向我指出一个体面的教程?我看过了,但我不确定我是否理解。
最佳答案
通常,SwingWorker 用于在 Swing 中执行长时间运行的任务。
在事件调度线程 (EDT) 上运行长时间运行的任务可能会导致 GUI 锁定,因此其中一件事是使用 SwingUtilities.invokeLater
和 invokeAndWait
它通过在运行所需任务(以 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();
}
}
}
doInBackground
和get
方法的返回类型指定为SwingWorker
的第一种类型,第二种类型为用于返回 publish
和 process
方法,本例中没有用到。
然后,为了调用 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/