Swing 当我调用一个JFrame和一个可从另一个JFrame调用的进程时,冻结GUI

Swing 当我调用一个JFrame和一个可从另一个JFrame调用的进程时,冻结GUI,swing,jframe,event-dispatch-thread,callable,Swing,Jframe,Event Dispatch Thread,Callable,我有两个jframe:WinA和WinB,还有一个可以调用的类来执行进程 WinA有一个按钮,可以用Callable在线程中执行进程,并用progressbar显示WinB WinA类代码-按钮执行的操作 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { try { WinA wa

我有两个jframe:WinA和WinB,还有一个可以调用的类来执行进程

WinA有一个按钮,可以用Callable在线程中执行进程,并用progressbar显示WinB

WinA
类代码-按钮执行的操作

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        try {
            WinA wa = new WinA();
            WinB wb = new WinB();
             ClaseCallable callbd = new ClaseCallable();
             ExecutorService exesrv = Executors.newSingleThreadExecutor();
             Future sresp;
             sresp = exesrv.submit(callbd);
             wb.getProgressbar().setIndeterminate(true);
             wb.setVisible(true);
             System.out.println(">>" + sresp.get());
             exesrv.shutdown();
             wb.setVisible(false);
        } catch (InterruptedException | ExecutionException ex) {
            Logger.getLogger(WinA.class.getName()).log(Level.SEVERE, null, ex);
        }
    }          
ClaseCallable
class代码

public class ClaseCallable implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        for(int i=0; i<10; i++){
            Thread.sleep(250);
        }
        return 33;
    }

}
public类ClaseCallable实现了Callable{
@凌驾
公共整数调用()引发异常{

对于(int i=0;i您正在调用的
future.get()
,它将一直阻止,直到任务完成:

得到V得到 抛出InterruptedException、ExecutionException

如有必要,等待计算完成,然后检索其结果


您的WinB应该是一个JDialog。我看到您的操作代码与Swing组件在同一个线程上执行。我还用JDialog尝试了它。它应该如何执行?…假设Callable在另一个线程@GilbertleBlanch中执行,但我看不到任务的进度,或者如果它是不确定的,请使用不确定…如果使用它不起作用,我不知道怎么做…@johngardner您是否可以使用
future.get(timeout,unit)
在循环中使用一个小的超时,直到它返回一个结果?否则,您将不得不从ui线程中查看如何正确使用future的其他示例。