我有一个登录表单对话框,显示在开始的步骤和用户必须登录继续应用程序。问题是,我不知道应用程序应该如何知道何时登录过程完成并继续。我认为我应该注册一个WindowListener
,并实现windowClosing
事件。在它里面,我应该从我的应用程序中调用一个方法来继续这个过程。但我不知道这个解怎么正确。因为我实现了登录表单作为一个类扩展JDialog
和应用程序实例化它作为一个局部变量。因此,我认为从Login
类内部调用应用程序的方法是不正确的。我不确定。这只是一种感觉。你有什么建议?
public class Application {
private Login login = null;
public Application() {
login = new Login();
}
public continue() {
//...
}
}
public class Login extends JDialog {
public Login() {
//...
}
public void processLogin() {
}
private class WindowEventHandler implements WindowListener {
public void windowClosing(WindowEvent e) {
if(#LoginProcessSuccessful?) {
// call application's continue method
}
}
}
}
使用和观察模式(又名监听器)。
基本上,Login
将提供某种注册过程,允许感兴趣的各方向类的实例注册自己。
当所需的事件发生时,Login
将通知这些各方事件已经发生…
基本前提是限制在类之间公开的信息量。Login
除了告诉侦听器某个事件已经发生之外,不应该关心其他任何事情。这也意味着您没有将代码紧密耦合在一起,从而提供了更大的灵活性。
public interface LoginListener {
public void loginSucceeded(); // You want to return some information about the caller...
public void loginFailed();
}
public class Application implements LoginListener {
private Login login = null;
public Application() {
login = new Login(this);
}
public void loginSucceeded() {
// Yea for me
}
public void loginFailed() {
// Sucks for you
}
}
public class Login extends JDialog {
private LoginListener listener;
public Login(LoginListener listener) {
//...
}
public void processLogin() {
if (loginSuccessful()) {
listener.loginSucceeded();
} else {
listener.loginFailed();
}
}
}
注意:这个例子使用了一个监听器,没有理由这样限制它,你可以提供一个机制来注册多个回调
public class Application {
private Login login = null;
public Application() {
login = new Login(this);
}
public continue() {
//...
}
}
public class Login extends JDialog {
Application app;
public Login(Application app) {
this.app=app;
}
public void processLogin() {
}
private class WindowEventHandler implements WindowListener {
public void windowClosing(WindowEvent e) {
if(#LoginProcessSuccessful?) {
this.app.continue()
}
}
}
}