2013-05-22 91 views
0

我有一个登录表单对话框,它显示在开始步骤中,用户必须登录才能继续执行应用程序。问题是我不知道应用程序应该知道登录过程何时完成并继续。我想我应该注册一个WindowListener并执行windowClosing事件。并在里面我应该从我的应用程序调用一个方法来继续这个过程。但我不知道这个解决方案是如何正确的。因为我实现了登录表单作为一个类扩展JDialog和应用程序实例化它作为本地变量。因此我认为从Login类中调用应用程序的方法是不正确的。我不确定。这只是一种感觉。 你有什么建议?如何从对象B调用对象A的方法,而对象B本身是A对象的属性?

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

使用和Observer Pattern(也是一个听众)。

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

} 

注:本例使用一个单一的听众,没有理由为什么你应该限制它以这种方式,你可以用于注册多个回调

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() 
      } 
     } 
    } 
} 
提供一种机制
相关问题