java – 更新GUI的SwingUtilities.invokeLater()问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 更新GUI的SwingUtilities.invokeLater()问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2663字,纯文字阅读大概需要4分钟。
内容图文
![java – 更新GUI的SwingUtilities.invokeLater()问题](/upload/InfoBanner/zyjiaocheng/752/94de16febe824941b5a73f0e1942a33c.jpg)
我整天都在尝试这种不同的变化,但收效甚微.请有人帮忙解释一下我做错了什么?我只是一个关于线程的初学者.
private JTextArea text = new JTextArea();
private JButton button = new JButton("Cancel");
public StatusFrame() {
text.setEditable(false);
this.add(text);
this.add(button, BorderLayout.EAST);
this.setSize(new Dimension(150, 100));
this.setVisible(true);
}
public void updateStatus(String textIn) {
text.setText(textIn);
}
public JButton getButton() {
return button;
}
在另一个课程中,我正在调用可能需要一段时间才能完成的方法.我希望能够调用StatusFrame.updateStatus()方法来让用户了解进度.
这就是我所拥有的:
someMethod() {
// prevent GUI from freezing using threads
final Runnable r = new Runnable() {
public void run() {
status = new StatusFrame();
}
};
SwingUtilities.invokeLater(r);
//do something
status.update("process 1 completed");
//do something else
status.updateStatus("Process 2 completed");
}
出现框架,但运行之后的代码似乎都没有运行/处理.它只是停止/阻止/某事.但GUI仍然有效
谢谢你的建议.
P.S.:我尝试过使用invokeAndWait()方法但又不确定我是否正确地使用它.现在快速修复将是首选,因为我还没有学到很多关于线程的知识.欢迎任何指示.
解决方法:
你有倒退的概念.
这是你的代码
someMethod() {
// prevent GUI from freezing using threads
final Runnable r = new Runnable() {
public void run() {
status = new StatusFrame();
}
};
SwingUtilities.invokeLater(r);
//do something
status.update("process 1 completed");
//do something else
status.updateStatus("Process 2 completed");
您应该在线程中执行长时间运行的代码,并使用SwingUtilities invokeLater方法更新GUI.
someMethod() {
// prevent GUI from freezing using threads
final Runnable r = new Runnable() {
public void run() {
status = new StatusFrame();
}
};
new Thread(r).start();
// inside the StatusFrame
//do something
SwingUtilities.invokeLater(new Runnable() {
public void run() {
update("process 1 completed");
}
);
//do something else sometime later
SwingUtilities.invokeLater(new Runnable() {
public void run() {
update("Process 2 completed");
}
);
我不知道我的回答是否清楚.
>启动Java应用程序时执行SwingUtilities.invokeLater以确保Swing组件位于Event Dispatch线程(EDT)上.
>从EDT中,将长时间运行的进程作为可运行的线程调用.
>在runnable线程中,由于您不在EDT上,因此每当您更新Swing组件时都要执行SwingUtilities.invokeLater.这可确保在EDT上更新Swing组件.
每个Swing应用程序都应该从这样的类开始:
import javax.swing.SwingUtilities;
import com.ggl.text.entry.model.TextEntryModel;
import com.ggl.text.entry.view.TextEntryFrame;
public class TextEntry implements Runnable {
@Override
public void run() {
new TextEntryFrame(new TextEntryModel());
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new TextEntry());
}
}
这堂课做了三件事.
>构造GUI数据模型.
>构造GUI JFrame.
>确保Swing组件在EDT上.
内容总结
以上是互联网集市为您收集整理的java – 更新GUI的SwingUtilities.invokeLater()问题全部内容,希望文章能够帮你解决java – 更新GUI的SwingUtilities.invokeLater()问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。