为什么要在Java中使用嵌套的InvokeLater调用?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了为什么要在Java中使用嵌套的InvokeLater调用?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2463字,纯文字阅读大概需要4分钟。
内容图文
![为什么要在Java中使用嵌套的InvokeLater调用?](/upload/InfoBanner/zyjiaocheng/744/a815e443b5a34fed85581700fd1bf3f8.jpg)
我正在重构一些运行多阶段过程的代码.每个步骤都在嵌套的java.awt.EventQueue.invokeLAter ….调用中.看起来有点像这样:
import java.awt.EventQueue;
public class NestedInvokeLater {
/**
* @param args
*/
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
changeTabPanel();
copySomeFiles();
enableNextButton1();
upDateProgressBar(10);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
readInFiles();
doSomethingToFiles();
upDateProgressBar(15);
java.awt.EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
doSomethingElse();
upDateProgressBar(100);
}
});
}
});
}
});
};
}
我在Java上已经足够新了,我没有把这些调用嵌套到EDT中添加“作业”,而且我也不是100%有信心摆弄这些调用.我想我理解invokeLater调用的作用,以及每个步骤的作用.如果这种理解是错误的,请纠正我:
invokeLater用于将一些调用添加到要在Event Dispatch线程中完成的作业列表中.然后,Java处理每次调用的时间/方式,确保EDT以及GUI在后台执行作业时不会锁定.
嵌套这些调用告诉我,我们应该排队一组作业,其中一个是排队的东西,这会排队一些工作….其中一个是排队的东西.但是,一旦上一个作业完成,第一个内部调用才会排队.一切都按顺序发生(这符合我对整个过程的理解),但我不明白为什么你会使用嵌套请求来排队作业.如果我从头开始编写这个函数,我会简单地为每次调用创建函数并依次调用它们.
我认识到,作为Java的新手,我可能会遗漏一些巨大的东西,这使得这种嵌套非常重要.但是没有关于这个的文档,也没有关于嵌套的代码的评论.
我错过了什么?什么,如果有什么是这个代码中的要点?
解决方法:
进行如此多的嵌套调用没有意义.它基于良好的意图,但实施得很糟糕.
如果要正确执行此操作,请使用SwingWorker.
documentation of SwingWorker有一个很好的例子,说明如何在应用程序的后台实现执行多个任务(PrimeNumbersTask类显示在那里).
编辑:以下是您在案例中应该使用SwingWorker做什么的示例.
class SequentialInvoker extends SwingWorker<Void, Integer> {
@Override
public void doInBackground() {
changeTabPanel();
copySomeFiles();
enableNextButton1();
setProgress(10);
readInFiles();
doSomethingToFiles();
setProgress(15);
doSomethingElse();
setProgress(100);
}
}
要在进度条上实际显示进度,请查看从SwingWorker文档复制的以下代码:
JTextArea textArea = new JTextArea();
JProgressBar progressBar = new JProgressBar(0, 100);
SequentialInvoker task = new SequentialInvoker();
task.addPropertyChangeListener(
new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer)evt.getNewValue());
}
}
});
使用此代码,您的进度条将显示SwingWorker的工作进度.
内容总结
以上是互联网集市为您收集整理的为什么要在Java中使用嵌套的InvokeLater调用?全部内容,希望文章能够帮你解决为什么要在Java中使用嵌套的InvokeLater调用?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。