有人可以解释下面的代码吗?
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程序的一部分,允许用户从文件夹中选择文件并将此文件拆分为块。
答案 0 :(得分:1)
您的代码设计错误,
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
但这是另一个重要篇章,你可以在互联网上找到很多关于这一点的信息。