解释Runnable和Invoke()

时间:2013-05-12 12:29:53

标签: java swing event-dispatch-thread invokelater

有人可以解释下面的代码吗?

public void setSelectedFolder(final File f){
    if(f != null){
        Runnable r=new Runnable(){
            public void run(){
                target.setText(f.toString());
            }
        };

        try {
            SwingUtilities.invokeLater(r);
        } catch(Exception x) {
        }
    }
}

它是Java程序的一部分,允许用户从文件夹中选择文件并将此文件拆分为块。

2 个答案:

答案 0 :(得分:1)

  • 您的代码设计错误,

  • 您遇到了Concurency in Swing

  • 的问题
  • FileIO应该包含在try - catch - finally块中,而不是invokeLater

  • 如果一切都结束,那么输出到AWT/Swing GUI可以包含在invokeLater

  • 使用SwingWorker(ev。Runnable#Thread)来实现这个想法

答案 1 :(得分:1)

  

public static void invokeLater(Runnable doRun)
  导致doRun.run()在AWT事件派发线程上异步执行。这将在处理完所有挂起的AWT事件后发生。当应用程序线程需要更新GUI时,应该使用此方法。

代码所做的唯一事情是将target.setText(f.toString());放入EDT以在那里执行并安全地更新TextField。如果你不这样做,你可能会面临丑陋的错误,因为Swing不是线程安全的 总是把东西放到EDT中对于可读性是不利的,因此SwingWorker可以很好地同步所有与GUI相关的长期运行任务,但在这个简单的例子中你不需要让那些{{1}为你做的工作,因为它是一个简单的设置器,没有任何漫长的等待时间。

这适用于SwingWorker,在这种情况下SwingUtilies.invokeLater()用于拥有Runnable方法,您可以在其中定义您希望EDT必须执行的代码。通常,您使用run()创建Runnables s 但这是另一个重要篇章,你可以在互联网上找到很多关于这一点的信息。