2013-11-14 37 views
1

实际上,我已经从一个框架(假设)A ..在摆动工人类中在do-in-background方法中调用swing工作者我有某些db查询,我也打电话给框架B .. done()方法,但我想处置框架..我怎么做..?我不能在框架A类中写入dispose(),因为这会导致在新框架(框架B)可见之前丢弃框架...请帮助!处理从swingWorker框架

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 
} 
+0

这种情况看起来像一个使用单个帧和[CardLayout](http://docs.oracle.com/javase/tutorial/uiswing/布局/ card.html)会更合适。还要注意,通过在'main()'和'doInBackground()'中修改EDT之外的摆动组件,你正在打破摆动线程规则。 – kiheru

+0

是不是可以处置frameA ..因为它需要在我的应用程序..我不能使用标签式窗口 – user2984132

回答

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

  2. doInBackground()不是为了做任何GUI渲染任务。您可以从doInBackground()函数调用publish(V)函数,然后调用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窗口。欲了解更多信息,请参阅The Use of Multiple JFrames, Good/Bad Practice?。需要多个帧的用例的一般工作是explained here.

+0

好的答案。 +1 –