我正在努力使用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");
}
});
这里的问题是我不能使用全局变量。有谁可以帮我解决这个问题?
答案 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“冻结”,直到此方法完成。如果您与服务器的交互需要很长时间,那么您需要在单独的线程中进行此操作。