猿问

挥杆使用.InvokeLater

挥杆使用.InvokeLater

我的问题与SwingUtilities.invokeLater..我什么时候该用它?是否每次需要更新GUI组件时都必须使用?它到底是做什么的?有没有其他选择,因为它听起来不直观,并添加了看似不必要的代码?



杨__羊羊
浏览 433回答 3
3回答

ITMISS

是否每次需要更新GUI组件时都必须使用?不,如果您已经在事件分派线程(EDT)上-在响应用户发起的事件(如单击和选择)时,情况总是如此。()actionPerformed方法等,都是由EDT调用的。)如果你不但是,在EDT上,并希望进行GUI更新(如果您想从某个计时器线程或网络线程等更新GUI),您必须进度表由EDT执行的更新。这就是这个方法的目的。Swing基本上是线程不安全的。也就是说,与该API的所有交互都需要在单个线程(EDT)上执行。如果需要从另一个线程(计时器线程、网络线程、.)进行GUI更新您需要使用您提到的方法(SwingUaryties.InvokeLater,SwingUaryties.InvokeAndWait,.)。

POPMUISE

Swing is single threaded and all changes to the GUI must be done on EDT基本用法invokeLater()主要方法应始终包装在invokeLater()将动作/事件延迟(但异步)到EventQueue,如果EDT不存在,则必须使用invokeLater()..你可以用if (SwingUtilities.isEventDispatchThread()) {...有存在invokeAndWait(),但直到今天,我(只是我的观点)还没有找到使用它的理由。invokeAndWait()而不是invokeLater(),除了对GUI的硬更改(JTree&JTable)之外,但仅用物质L&F(非常适合测试EDT上事件的一致性)基本材料:在Swing中并发所有来自后台任务的输出必须包装在invokeLater()

慕莱坞森

每个Swing应用程序至少有两个线程:执行应用程序的主线程。EDT(事件分派线程)是一个更新UI的线程(因此UI不会冻结)。如果要更新UI,则应在EDT中执行代码。像SwingUaryties.InvokeLater、SwingUaryties.InvokeAndWait、EventQueue.InvokeLater、EventQueue.InvokeAndWait等方法允许您通过EDT执行代码。
随时随地看视频慕课网APP

相关分类

Java
我要回答