2011-02-17 142 views
1

有没有办法阻止在EDT上的执行,仍然有一个生动的GUI?等待多线程的AWT事件调度程序线程

我注意到,当调用setVisible(true)时,JDialog/JOptionPane有类似的东西。

为什么我需要这个?

我的班级应满足下列接口:

interface Quitable { 
    boolean quit(); 
} 

我的班级需要这样的实现:

class MyApp implements Quitable { 
    ExecutorService executor = Executors.newCachedThreadPool(); 
    // ... 
    public boolean quit() { 
      FuturTask<Boolean> futureTask = new FutureTask<Boolean>(saveJob); 
      executor.execute(futureTask); 
      // TODO: keep gui vivid 
      boolean saveResult = futureTask.get(); 
      return saveResult; 
    } 
    // ... 
} 

我需要返回保存过程的结果(这可能需要一些时间并可能失败)。或者你会建议另一种解决方案?感谢您的任何想法。 ;)

回答

1

Dialog导致事件循环在阻塞时执行。有一个过滤器允许某些事件通过重新绘制请求,调用事件和事件到对话窗口。这个API没有公开。

有一个库(Foxtrot,IIRC),它使用Dialog上的黑客来暴露此行为。

我强烈建议以这样的方式构建您的程序,这不是必需的。这是一个非常程序性而非事件驱动的组织。因此,将任务排列在另一个线程上(可能是线程池/执行程序服务或GUI类事件循环),然后使用java.awt.EventQueue.invokeLater更新GUI。

+0

有关JDialog-Hack的介绍:http://www.futuretek.com/presents/foxtrot/KeepingYourSwingApplicationsResponsiveUsingFoxTrot.ppt – Synox 2011-02-18 14:04:30

1

JDialog不会阻止EDT的执行,EDT在以模式打开时会忽略除jDialog事件以外的事件。

我建议你在调用quit方法之前将进度条显示为模态。