-1

アクション リスナーで dispose() メソッドを使用してフレームを閉じようとしていますが、機能しません。

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();
    }
}

フレームを作成しようとしましたが、これはループに入ります。

4

1 に答える 1

1

dispose明らかにあなたのコントローラーの方法ではありません。また、コントローラーが直接アクセスできるコンポーネントの方法でもありません。

あなたが自分自身に尋ねる必要がある質問は、あなたのコントローラーが何かを閉じるのが適切な振る舞いであるということです。

LoginPaneそれが、破棄できる、または破棄する必要のあるコンテキスト内に実際に存在するという保証はありません。LoginPaneが実際にの一部である場合CardLayout、の親ウィンドウを任意に破棄するとLoginPane、アプリケーションが不適切に強制終了されます。

このようにアプリケーションの他の部分について何かを想定することは危険で悪い設計です/

より良い方法は、LoginPaneログインが成功したときに、にイベントを発生させるか、コントローラーにイベントを発生させ、他のコントローラーがそれにどのように反応するかを選択できるようにすることです。

あなたがこの行動方針にひどく曲がっているなら、あなたはを使うことができますSwingUtilities.getWindowAncestor(Component)Windowこれにより、常駐するが返されComponentます。

SwingUtilities.getWindowAncestor(login).dispose();

個人的には、null Window

于 2013-02-21T23:16:09.517 に答える