Java8 SWT面板更新异常:耗时任务完成后才批量更新
SWT状态栏延迟更新问题解决
核心问题:线程启动方式错误
你的代码里启动后台任务时犯了一个关键错误——调用Thread.run()而非Thread.start():
new Thread(new Runnable() { public void run() { metadataGenerationEvent(); } }).run(); // 错误:直接执行Runnable代码,未启动新线程
run()方法只是在当前UI线程中同步执行Runnable逻辑,并没有创建独立的后台线程。这导致整个文件计算任务完全阻塞了UI线程,所有通过asyncExec提交的状态栏更新请求都被积压,直到任务全部完成后,UI线程才会批量处理这些请求,表现为状态栏一次性更新。
修复方案
1. 正确启动后台线程
把run()替换为start(),真正创建独立线程执行耗时任务:
new Thread(new Runnable() { public void run() { metadataGenerationEvent(); } }).start(); // 正确:启动新线程,不阻塞UI
修改后,文件计算任务会在后台线程运行,UI线程可以实时处理asyncExec发来的更新请求,状态栏就能逐文件更新。
2. 简化状态栏更新逻辑(可选)
setStatusbarText中的update()和getParent().layout()属于冗余操作,SWT在UI线程更新控件文本后会自动调度重绘。可以简化代码:
public void setStatusbarText(String estado) { try { barStatus.setText(estado); // 以下两行通常无需保留,除非有特殊重绘需求 // barStatus.update(); // barStatus.getParent().layout(); } catch (Exception e) { System.err.println("ERROR: " + e); } }
3. 并发安全防护(可选)
如果DocumentTree的documents集合可能被UI线程修改,需要添加同步锁避免并发修改异常:
public void metadataGeneration() { synchronized(this.documents) { for (Documento document : this.documents) { mainController.updateStatus("Calculating metadata of file", document.absolutePath()); document.calculateMetadata(); } } }
效果验证
完成上述修改后,每处理一个文件时,状态栏会立即更新为当前文件的路径,符合你预期的实时反馈效果。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

