1

实际上我已经从框架(假设)A中调用了swing工作者。在do-in-Background方法的swing工作者类中我有某些数据库查询,我也在调用框架B..在done()方法中但是我想处置框架 A.. 我该怎么做..?我不能在框架 A 类中编写 dispose(),因为这会导致在新框架(框架 B)可见之前处理框架......请帮助!

class frameA extends JFrame{
public frameA(){
//done some operations..
SwingWorker worker=new Worker();
       worker.execute();

}
public static void main(string[] args){
  new frameA();
}

}

在工人阶级

class Worker extends SwingWorker<Void, String> {



public Worker() {
    super();


}

//Executed on the Event Dispatch Thread after the doInBackground method is finished
@Override
protected void done() {
    //want to dispose the frameA here..


}

@Override
protected Void doInBackground() throws Exception {
    // some db queries
  new frameB().setVisible(true);  
  // call to frameb
}
4

1 回答 1

3
  1. done()方法SwingWorker通常被覆盖以显示最终结果。完成后 doInBackground(), 在 EDT中SwingWorker自动调用 。done()所以把你框架的不可见和可见代码放在这个函数中。

  2. doInBackground()并不意味着执行任何 GUI 渲染任务。您可以 publish(V)doInBackground()函数调用,该函数又调用process(V)在 EDT 内运行并执行 GUI 渲染任务的方法。

所以一个示例解决方案是:

class Worker extends SwingWorker<Void, String> {

  JFrame frameA;

  public Worker(JFrame frameA) {
    this.frameA = frameA;

  }

  @Override
  protected void done() {
    frameA.dispose();
    new frameB().setVisible(true); 

  }
  //other code
}

现在,SwingWorker通过将目标框架传递给它的构造函数来创建您的实例new Worker(frame):对于您的上下文,您可能可以使用this

但是,您不应该真正将应用程序设计为依赖于多个JFrame. JFrame不使用多窗口是有原因的。有关更多信息,请参阅多个 JFrame 的使用,好/坏做法?. 此处解释了需要多帧的用例的一般解决方法。

于 2013-11-14T11:35:13.807 回答