2014-03-05 31 views
1

所以我目前有一個程序有兩個窗口延伸JFrame重新構建JFrame in actionPerformed方法

主窗口有一個打開新窗口(窗口2)的按鈕。 Window2有自己定義的類與小部件和偵聽器。此刻,如果我在主窗體中多次按下按鈕,同時第二個窗口仍然打開,那麼它將切換到該窗口,而不會創建一個新窗口(這正是我想要的)。

第二個窗口還有一些小部件,一個搜索字段和一個根據用戶在JTextField中輸入的內容填充的表格。問題是,一旦我關閉了Window2並按下主窗口中的按鈕重新打開它,就會出現同一個窗口,並在搜索字段和填充表中顯示先前輸入的文本。

事情是,我想這樣做,一旦Window2關閉並重新打開,然後我創建一個全新的Window2實例與空搜索字段和表。我認爲這將適用於JFrame.DISPOSE_ON_CLOSE但它沒有。

我的代碼有一點也許可以解釋這更好:

public class MainWindow extends JFrame{ 

    /* 
    * create widgets and panels in Main window 
    */ 
    private Window2 ww = null; 
    Button.addActionListener(new ActionListener() { // the button that opens 
                //a new window 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        if (ww==null) { //creating the new window here 
         ww = new Window2(); 
         ww.setTitle("Window2"); 
         ww.setSize(600, 400); 

       } 
       ww.setVisible(true); 
      }); 
    } 


/* 
* Window 2 
*/ 

public class Window2 extends JFrame { 

//add widgets and listeners 

pack(); 
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
} 
+0

使用CardLayout與JFrame.pack() – mKorbel

+1

不要使用多個JFrames - 欲瞭解更多信息,請看這裏http://stackoverflow.com/questions/9554636/the-use-of-multiple-jframes-good-bad-練習 – jrowe08

+0

不幸的是,我必須這樣做,這是我學校項目的一項要求。 – user3281466

回答

3

有許多你可能實現這一目標的方式,最簡單的將是檢查,看看是否窗口可見或不可見,例如......現在

public void actionPerformed(ActionEvent e) { 
    if (ww==null || !ww.isVisible()) { 
     ww = new Window2(); 
     ww.setTitle("Window2"); 
     // You should be using pack 
     ww.setSize(600, 400); 
    } 
    ww.setVisible(true); 
} 

,話說回來,這是一般不提倡用這種方式來使用多個框架,因爲它混淆用戶,尤其是當他們可能已經打開了多個窗口做其他事情,其他幀可以變得「迷失」。

您應該考慮使用模式對話框,強制用戶使用對話框完成工作,並在完成時關閉它。這將阻止用戶與父窗口交互,直到對話框關閉或使用CardLayoutJTabbedPane,允許您根據需要在視圖之間切換。

+1

+1 - 這是一個比我的評論中的想法更好的解決方案,儘管我不得不考慮是否會有某種資源泄漏(並且我相當確定不會有這種情況)。不太確定關於模態對話的建議 - 有時多幀是最好的解決方案。我想我們必須相信OP才能知道她實際上想要實現什麼。 –

+0

@DavidWallace同意,完全缺乏語境並沒有幫助,但我們也應該提供經驗教訓。這些只是替代的可能性,可能有助於解決長期問題或工作流程。作爲開發人員和用戶,我知道多個幀在後端是一個完整的痛苦...... – MadProgrammer

+0

非常感謝。您能否讓我知道爲什麼DISPOSE_ON_CLOSE在這種情況下不起作用? – user3281466