Java 如何使用SwingWorker实时更新GUI?

Java 如何使用SwingWorker实时更新GUI?,java,swing,swingworker,Java,Swing,Swingworker,每当方法的任务完成时,我都试图在JTextArea中呈现消息。我的方法需要一些时间。这是关于连接到网络或使用I/O的,您已经知道这些任务需要时间 为了使应用程序更加用户友好,我想在JTextArea中显示消息。从昨天起我就一直在这个问题上纠缠不休。今天早上我问了一个问题,并得到了一些关于如何实现我的目标的建议。似乎SwingWorker有助于在继续更新GUI的同时执行后台任务 所以我尝试过使用这个类,看过很多例子和Java文档,但我真的不知道如何在我的应用程序中实现它。为了帮助您理解,我举了以下

每当方法的任务完成时,我都试图在
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();

}
}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入javax.swing.*;
类MyMethods{
//让我们假设这项任务需要很长时间。
公共静态字符串firstTask(){
返回“\n第一个任务工作已完成。”;
}
//让我们假设这项任务需要很长时间。
公共静态字符串secondTask(){
返回“\n第二个任务工作已完成。”;
}
}
类TaskCounter扩展SwingWorker{
公共任务计数器(){}
受保护整数doInBackground(){
MyMethods.firstTask();
MyMethods.secondTask();
返回null;
}
受保护的void done(){
MyFrame.textArea.append(MyMethods.firstTask());
MyFrame.textArea.append(MyMethods.secondTask());
}
}
类MyFrame扩展JFrame实现ActionListener{
静态JPanel面板;
静态JTextArea textArea;
静态按钮开始按钮;
TaskCounter任务=新建TaskCounter();
公共MyFrame(){
设置大小(200200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel=新的JPanel();
textArea=新的JTextArea(20,20);
面板布局(新网格布局(2,2));
startButton=新的JButton(“开始”);
面板。添加(文本区域);
面板。添加(开始按钮);
addActionListener(这个);
添加(面板);
setVisible(真);
}
@凌驾
已执行的公共无效操作(操作事件e){
task.execute();
}
}
公共类SwingWorkerTest{
公共静态void main(字符串参数[]){
MyFrame=新的MyFrame();
}
}
我想做的是显示消息,不是一次,而是一个接一个。当
firstTask()
完成时,显示消息
“first work done”
,然后在一段时间后显示消息
secondTask()
完成时,显示消息
“second work done”
。请假定
firstTask()
secondTask()
方法需要一些时间才能完成

我已经了解到,长时间运行的任务应该放在
doInBackground()
方法中,与更新GUI相关的方法应该放在
done()
方法中

我怎样才能解决这个问题


谢谢你的阅读,很抱歉你的表情很尴尬

您的后台线程应该调用

String message="hi im processx";
SwingWorker.publish(message);
你必须验证这个方法

SwingWokrer.process().
此方法在EDT上调用,前提是该方法在参数中具有在发布之前传递的消息(可能是一个或多个消息)

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


你可以在

@andrewhompson中了解更多关于这些方法的信息。对不起,ackward的表达。事实上,英语不是我的母语,我试着编辑那句话。也许需要一段时间。我花了30分钟写我的问题…//我编辑了它^^@AndrewThompson感谢您的建议和考虑。我将下载FireFox并安装您提供的插件,谢谢!我从你的回答中找到了一些线索。。。谢谢