WindowListener用于关闭JFrame并使用全局变量

时间:2013-11-11 14:14:49

标签: java swing user-interface jframe windowlistener

我正在努力使用WindowListener来关闭JFrame。

我遇到客户端登录到服务器的情况,当客户端关闭其应用程序时,需要通知服务器。因此,为了通知服务器,应该解决另一个类的实例(处理rmi实现)。该实例是我的GUI类中的全局变量。

我在网上搜索了一下,但我可以解决的问题是以下结构

addWindowListener(new WindowAdapter() 
{
  public void windowClosed(WindowEvent e)
  {
    System.out.println("jdialog window closed event received");
  }

  public void windowClosing(WindowEvent e)
  {
    System.out.println("jdialog window closing event received");
  }
});

这里的问题是我不能使用全局变量。有谁可以帮我解决这个问题?

1 个答案:

答案 0 :(得分:1)

过去当我遇到同样的问题时,我决定实施一个Singleton pattern来保持用户当前会话的“全局”。这样我就可以访问我需要的任何类中的当前会话。

它应该是这样的:

public class SessionManager {

    private static SessionManager instance;
    private Session currentSession; // this object holds the session data (user, host, start time, etc)

    private SessionManager(){ ... }

    public static SessionManager getInstance(){
        if(instance == null){
            instance = new SessionManager();
        }
        return instance;
    }

    public void startNewSession(User user){
        // starts a new session for the given User
    }

    public void endCurrentSession(){
        // here notify the server that the session is being closed
    }

    public Session getCurrentSession(){
        return currentSession;
    }
}

然后我在endCurrentSession()方法中调用windowClosing(),如下所示:

public void windowClosing(WindowEvent e) {
    SessionManager.getInstance().endCurrentSession();
}

注意:此处调用此方法将在Event Dispatch Thread中执行,导致GUI“冻结”,直到此方法完成。如果您与服务器的交互需要很长时间,那么您需要在单独的线程中进行此操作。