为什么要在Java中使用嵌套的InvokeLater调用?
我正在重构一些运行多阶段过程的代码.每个步骤都在嵌套的
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做什么的示例. 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的工作进度. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |