如何从对象B调用对象A的方法,对象B本身是A对象的属性?

时间:2013-05-22 04:40:36

标签: java swing event-handling

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

2 个答案:

答案 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()
            }
        }
    }
}