为了账号安全,请及时绑定邮箱和手机立即绑定

挥杆使用.InvokeLater

挥杆使用.InvokeLater

杨__羊羊 2019-07-03 17:17:37
挥杆使用.InvokeLater我的问题与SwingUtilities.invokeLater..我什么时候该用它?是否每次需要更新GUI组件时都必须使用?它到底是做什么的?有没有其他选择,因为它听起来不直观,并添加了看似不必要的代码?
查看完整描述

3 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

是否每次需要更新GUI组件时都必须使用?

不,如果您已经在事件分派线程(EDT)上-在响应用户发起的事件(如单击和选择)时,情况总是如此。()actionPerformed方法等,都是由EDT调用的。)

如果你但是,在EDT上,并希望进行GUI更新(如果您想从某个计时器线程或网络线程等更新GUI),您必须进度表由EDT执行的更新。这就是这个方法的目的。

Swing基本上是线程不安全的。也就是说,与该API的所有交互都需要在单个线程(EDT)上执行。如果需要从另一个线程(计时器线程、网络线程、.)进行GUI更新您需要使用您提到的方法(SwingUaryties.InvokeLater,SwingUaryties.InvokeAndWait,.)。


查看完整回答
反对 回复 2019-07-03
?
POPMUISE

TA贡献1765条经验 获得超5个赞

Swing is single threaded and all changes to the GUI must be done on EDT

基本用法invokeLater()

  1. 主要方法应始终包装在invokeLater()

  2. 将动作/事件延迟(但异步)到EventQueue,

  3. 如果EDT不存在,则必须使用invokeLater()..你可以用if (SwingUtilities.isEventDispatchThread()) {...

  4. 有存在invokeAndWait(),但直到今天,我(只是我的观点)还没有找到使用它的理由。invokeAndWait()而不是invokeLater(),除了对GUI的硬更改(JTree&JTable)之外,但仅用物质L&F(非常适合测试EDT上事件的一致性)

  5. 基本材料:在Swing中并发

  6. 所有来自后台任务的输出必须包装在invokeLater()


查看完整回答
反对 回复 2019-07-03
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

每个Swing应用程序至少有两个线程:

  1. 执行应用程序的主线程。
  2. EDT(事件分派线程)是一个更新UI的线程(因此UI不会冻结)。

如果要更新UI,则应在EDT中执行代码。像SwingUaryties.InvokeLater、SwingUaryties.InvokeAndWait、EventQueue.InvokeLater、EventQueue.InvokeAndWait等方法允许您通过EDT执行代码。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 432 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号