2013-11-14 38 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 –