0

有人可以在下面的书面代码中解释一下吗?

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 程序的一部分,它允许用户从文件夹中选择一个文件并将该文件分割成块。

4

2 回答 2

1
  • 你的代码有错误的设计,

  • 在 Swing 中遇到了 Concurency 的问题

  • FileIO应该包裹在try - catch - finally块内,而不是invokeLater

  • 如果一切都结束了,那么输出到AWT/SwingGUI 可以被包裹在里面invokeLater

  • 使用SwingWorker(ev. Runnable#Thread) 表示这个想法

于 2013-05-12T12:34:39.923 回答
1

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

代码唯一要做的就是放入target.setText(f.toString());EDT 以在那里执行并TextField安全地更新您的代码。如果你不这样做,你可能会因为 Swing 不是线程安全的而面临丑陋的错误。
总是将东西放入 EDT 不利于可读性,因此SwingWorker会通过同步所有与 GUI 相关的长时间运行的任务来完成这项艰苦的工作,但在这种简单的情况下,您不需要让那些SwingWorkers 为您完成工作,因为它是一个简单的设置器,无需长时间等待。

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

于 2013-05-12T12:39:21.127 回答