通常,
SwingWorker用于在
Swing中执行长时间运行的任务。
在事件调度线程(EDT)上运行长时间运行的任务可能会导致GUI锁定,因此要做的一件事情是使用
SwingUtilities.invokeLater并
invokeAndWait保持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(); } }}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" pre here. // include: "JButton" b pre here. f.getContentPane().add(b); f.getContentPane().add(new JButton("Nothing")); f.pack(); f.setVisible(true);}运行该应用程序后,将有两个按钮。一个标有“答案!”的标签 还有另一个“没事”。当一个人点击“答案!” 按钮,一开始什么都不会发生,但是单击“无”按钮将起作用,并表明GUI响应。
并且,一秒钟后,的结果
AnswerWorker将出现在消息框中。



