-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它实际上是 a 的一部分CardLayout,如果你任意处置 的LoginPane父窗口,你只是不恰当地杀死了应用程序。

以这种方式假设应用程序的其他部分是危险和糟糕的设计/

更好的方法是LoginPane在成功登录时允许触发事件或让控制器触发事件​​,并允许其他控制器选择它应该如何响应它。

如果你对这种做法非常执着,你可以使用SwingUtilities.getWindowAncestor(Component). Window这将传回Component驻留的。

SwingUtilities.getWindowAncestor(login).dispose();

我个人也会检查一个null Window

于 2013-02-21T23:16:09.517 回答