2013-02-21 79 views
-1

我想關閉一個框架使用dispose()方法,在一個動作偵聽器,但它不會工作。關閉下面的MVC JFrame

public class LoginController implements ActionListener, Observer { 

    private JTextField name; 
    private JTextField password; 
    private LoginPage login; 

/// // LoginFrame f1 = new LoginFrame(); 
    public LoginController(JTextField name, JTextField Password, LoginPage login) { 
     this.name = name; 
     this.password = Password; 
     this.login = login; 

    } 

    public void actionPerformed(ActionEvent e) { 
     login.LoginPage(); 
     login.checkLogin(name.getText(), password.getText()); 
     // dipose(); 
    } 
} 

我試過創建框架,但是這進入循環。

+0

「不會工作」 是不準確的。進一步解釋你面臨的問題。 – 2013-02-21 23:09:42

回答

1

dispose顯然不是你的控制器的方法。它也不是您的控制器可直接訪問的任何組件的方法。

您需要問自己的問題是否是您的控制器關閉任何東西的恰當行爲。

您不能保證該LoginPane實際上存在於您可以或應該處置的上下文中。如果LoginPane實際上是CardLayout的一部分,如果您任意處置了LoginPane的父窗口,那麼您不恰當地殺死了該應用程序。

這是危險的,糟糕的設計假設以這種方式對應用程序的其它地區有什麼/

更好的方法是要麼讓LoginPane觸發事件或有控制火災的事件,在成功登錄並允許一些其他控制器對它應該如何作出選擇作出選擇。

如果你是這個行爲的傾向,你可以使用SwingUtilities.getWindowAncestor(Component)。這將返回Component所在的Window

SwingUtilities.getWindowAncestor(login).dispose(); 

我個人而言,還檢查了nullWindow

+0

dipose()方法適用於JFrame我明白,我希望actionListener可以在控制器類中單擊按鈕時使用dispose()方法刪除框架。 – user2097274 2013-02-21 23:31:05

+0

是的,那個答案的哪一部分沒有引導你做到這一點。僅僅因爲我認爲這是個不好的主意和設計並不意味着我沒有提供實現這個目標的方法...... – MadProgrammer 2013-02-21 23:32:36

+0

對不起,我很感謝你的回答,對於措辭嚴厲的回覆感到抱歉。謝謝 – user2097274 2013-02-21 23:36:14