0

我有一个登录表单对话框,该对话框显示在开始步骤中,用户必须登录才能继续使用该应用程序。问题是我不知道应用程序应该如何知道登录过程何时完成并继续。我想我应该注册一个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
            }
        }
    }
}
4

2 回答 2

2

使用和观察者模式(又名监听器)。

基本上,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();
        }
    }

}

注意:此示例使用单个侦听器,没有理由以这种方式限制它,您可以提供注册多个回调的机制

于 2013-05-22T04:44:15.393 回答
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()
            }
        }
    }
}
于 2013-05-22T04:45:29.867 回答