我正在尝试使用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();
}
}
我已尝试创建框架,但这会进入循环。
答案 0 :(得分:1)
dispose
显然不是您控制器的方法。它也不是控制器可以直接访问的任何组件的方法。
你需要问自己的问题是,你的控制器关闭任何东西都是恰当的行为。
您无法保证LoginPane
实际存在于您可以或应该处置的上下文中。如果LoginPane
实际上是CardLayout
的一部分,如果您随意处置LoginPane
的父窗口,那么您刚刚不恰当地杀死了该应用程序。
以这种方式假设关于应用程序的其他部分的任何内容是危险和糟糕的设计/
更好的方法是允许LoginPane
触发事件或让控制器触发事件,成功登录并允许其他控制器选择应如何对其做出反应。
如果你对这个行动方案很不满意,你可以使用SwingUtilities.getWindowAncestor(Component)
。这将传回Window
所在的Component
。
SwingUtilities.getWindowAncestor(login).dispose();
我个人也会检查null
Window