Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多线程等待AWT事件调度程序线程_Java_User Interface_Swing_Awt - Fatal编程技术网

Java 使用多线程等待AWT事件调度程序线程

Java 使用多线程等待AWT事件调度程序线程,java,user-interface,swing,awt,Java,User Interface,Swing,Awt,有没有一种方法可以阻止EDT上的执行,同时仍然有一个生动的gui 在调用setVisible(true)时,我注意到JDialog/JOptionPane有类似的功能 为什么我需要这个 我的类应该满足以下接口: interface Quitable { boolean quit(); } 我的类需要这样的实现: class MyApp implements Quitable { ExecutorService executor = Executors.newCachedThrea

有没有一种方法可以阻止EDT上的执行,同时仍然有一个生动的gui

在调用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;
   }
   // ...
}
类MyApp实现了Quitable{
ExecutorService executor=Executors.newCachedThreadPool();
// ...
公共布尔退出(){
FuturTask futureTask=新的futureTask(保存作业);
执行人。执行(未来任务);
//TODO:保持gui生动
布尔saveResult=futureTask.get();
返回保存结果;
}
// ...
}

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

JDialog不阻止EDT的执行,当JDialog作为模态打开时,EDT会忽略除JDialog事件以外的事件


我建议您在调用quit方法之前,将progressbar显示为模态

对话框
使A事件循环在阻塞时执行。有一个过滤器允许某些事件通过,例如重新绘制请求、调用事件和对话框窗口事件。这方面的API没有公开

有一个库(,IIRC),它使用
对话框上的黑客来暴露这种行为


我强烈建议您以一种不需要的方式构建您的计划。这是一个非常程序化而非事件驱动的组织。因此,在另一个线程(可能是线程池/执行器服务或类似GUI的事件循环)上对您的任务进行排队,然后使用
java.awt.EventQueue.invokeLater

介绍JDialog Hack更新GUI: