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并安装您提供的插件,谢谢!我从你的回答中找到了一些线索。。。谢谢