加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

为什么要在Java中使用嵌套的InvokeLater调用?

发布时间:2020-12-15 04:08:28 所属栏目:Java 来源:网络整理
导读:我正在重构一些运行多阶段过程的代码.每个步骤都在嵌套的 java.awt.EventQueue.invokeLAter ….调用中.看起来有点像这样: import java.awt.EventQueue;public class NestedInvokeLater { /** * @param args */ public static void main(String[] args) { ja
我正在重构一些运行多阶段过程的代码.每个步骤都在嵌套的 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的工作进度.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读