2014-03-04 29 views
0

我已經查看了如何在單擊按鈕時只打開一個窗口的主題,但沒有任何解決方案可以幫助,也許是因爲我的代碼結構有點不同。只在操作中打開一個窗口已執行

所以我有一個主窗口類擴展JFrame和其中一個按鈕應該打開一個新窗口點擊。我已經在單獨的課程中爲新窗口定義了窗口小部件/面板等。目前,我每次點擊按鈕時都會打開一個新窗口。我想這樣做,如果一個窗口已經打開,那麼一旦再次點擊該按鈕,它將切換到該窗口。

這裏有點我的代碼:

public class MainWindow extends JFrame{ 

    /* 
    * create widgets and panels 
    */ 
    Button.addActionListener(new ActionListener() { // the button that opens 
                //a new window 

       @Override 
       public void actionPerformed(ActionEvent e) { 
        Window2 ww = new Window2(); //creating the new window here 

       } 
      }); 
    } 

NB。如果有任何幫助,Window2類也擴展JFrame。

感謝

+0

你必須在你的MainWindow類中存儲你的Window2對象,當你的行爲被執行時,你創建/顯示/放在前臺 – Athanor

+0

*「我已經瀏覽了關於如何只打開一個窗口的主題..」*什麼是這些主題的鏈接? –

+0

*「Window2類也擴展JFrame,..」*不要擴展框架,也不要有兩個框架。請參閱[使用多個JFrames,好的/壞的實踐?](http://stackoverflow.com/a/9554657/418556)請注意,如果第二個「窗口」實際上是一個模式的「JDialog」,則不可能讓用戶同時打開它兩次。 –

回答

1

這是一個完整的工作示例:

Window2.java

public class Window2 extends JFrame { 

    private static final long serialVersionUID = 7843480295403205677L; 

} 

MainWindow.java

public class MainWindow extends JFrame { 

    private static final long serialVersionUID = -9170930657273608379L; 

    public static void main(String[] args) { 
     MainWindow mw = new MainWindow(); 
     mw.go(); 
    } 

    private void go() { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private void createAndShowGUI() { 
     JButton button = new JButton("Click me"); 

     button.addActionListener(new ActionListener() { 

      private Window2 ww = null; 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (ww==null) { 
        ww = new Window2(); //creating the new window here 
        ww.setDefaultCloseOperation(HIDE_ON_CLOSE); 
        ww.setTitle("Window2 created on " + new Date()); 
        ww.setSize(500, 200); 
       } 

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

     setLayout(new BorderLayout()); 
     add(button); 

     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

     pack(); 
     setVisible(true); 
    } 
} 
+0

我已經嘗試了這與完全相同的語句,但我不知道該怎麼把別的說明,以便它切換到打開的窗口。當我點擊按鈕時,它不斷打開新的窗口,它不應該什麼都不做? – user3281466

+1

@ user3281466我已經用完整的工作示例更新了我的答案。 – Stephan

+0

啊謝了,我有幾乎相同的代碼,但它似乎沒有工作,因爲我已經在Window2類中定義了setVisible(true),並且我沒有明確地在actionPerformed方法中的ww對象上調用它。謝謝。 – user3281466

0

瓦在你可以嘗試做兩個窗口,並把主要類的actionPeformed方法,以便當按鈕被按下時,它顯示第二個窗口

2

拉出ojbect創建actionPerformed方法beacuse每次單擊按鈕它的創建新對象。下面可以幫助你: -

  1. 做一個Window2類singalton關於singalton點擊的更多細節here

2。添加空檢查如下: -

.... 
Window2 ww = null; // static or instence variable 
...... 
@Override 
public void actionPerformed(ActionEvent e) { 
if(ww==null) 
{ 
    ww = new Window2(); 
    ww.someMethod(); 

} 
else 
{ 
    ww.someMethod(); 

} 

} });

+0

我已經試過這個,如果陳述完全一樣,但我不知道該怎麼把其他語句放到它,以便它切換到打開的窗口。當我點擊按鈕時,它不斷打開新的窗口,它不應該什麼都不做? – user3281466

相關問題