我有一个登录表单对话框,显示在开始步骤中,用户必须登录才能继续使用该应用程序。问题是我不知道应用程序在登录过程完成后应该如何知道并继续。我想我应该注册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
}
}
}
}
答案 0 :(得分:2)
使用和Observer Pattern(AKA是听众)。
基本上,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();
}
}
}
注意:此示例使用单个侦听器,没有理由以这种方式限制它,并且您可以提供注册多个回调的机制
答案 1 :(得分:0)
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()
}
}
}
}