如何使用SwingWorker实时更新GUI?

时间:2013-12-14 17:56:29

标签: java swing swingworker

每当方法的任务完成时,我都会尝试在JTextArea中显示消息。我的方法需要一些时间。这是关于连接到网络或使用I / O,您已经知道这些任务需要时间。

为了使应用程序更加用户友好,我想在JTextArea中显示消息。从昨天开始,我一直坚持这个问题。今天早上我问了一个关于这个的问题,并就如何实现我的目标提出了一些建议。看来SwingWorker有助于在继续更新GUI的同时执行后台任务。

所以我尝试使用这个类,看过很多例子和Java文档,但我真的不知道如何在我的应用程序中实现它。为了帮助您理解,我做了以下示例:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

class MyMethods {

// Let's suppose this task takes a long time.
public static String firstTask(){
    return "\nfirst task work done.";
}

// Let's suppose this task takes a long time.
public static String secondTask(){
    return "\nsecond task work done.";
}
}


class TaskCounter extends SwingWorker<Integer, Integer> {

public TaskCounter(){}

protected Integer doInBackground(){
    MyMethods.firstTask();
    MyMethods.secondTask();
    return null;
}

protected void done(){
    MyFrame.textArea.append(MyMethods.firstTask());
    MyFrame.textArea.append(MyMethods.secondTask());
}

}

class MyFrame extends JFrame implements ActionListener {

static JPanel panel;
static JTextArea textArea;
static JButton startButton;
TaskCounter task = new TaskCounter();

public MyFrame(){
setSize(200,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

panel = new JPanel();
textArea = new JTextArea(20,20);
panel.setLayout(new GridLayout(2,2));
startButton = new JButton("START");

panel.add(textArea);
panel.add(startButton);
startButton.addActionListener(this);
add(panel);

setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {    
    task.execute();
}

}

public class SwingWorkerTest {
public static void main(String args[]) {
    MyFrame frame = new MyFrame();

}
}

我想要做的是显示消息,而不是一次显示消息。完成firstTask()后,在"first work done"完成后显示消息secondTask()然后稍后,显示消息"second work done"。请假设firstTask()secondTask()方法需要一些时间才能完成。

我认为应该将长时间运行的任务放入doInBackground()方法中,并且应该将与更新GUI相关的方法放入done()方法中。

我该如何解决这个问题?

感谢您的阅读,并抱歉尴尬的表达。

1 个答案:

答案 0 :(得分:0)

你的后台线程应该调用方法

String message="hi im processx";
SwingWorker.publish(message);

你必须采用ovveride方法

SwingWokrer.process().

这个方法是在EDT上调用的,当它与之前传递的消息一起被释放(可能是一个或多个)时。

您应该在那里显示您的进度

Yo可以在SwingWorker documentation

中详细了解这些方法