0

JFrames を閉じるために WindowListener を使用するのに苦労しています。

クライアントがサーバーにログオンしている状況があり、クライアントがアプリケーションを閉じるときにサーバーに通知する必要があります。そのため、サーバーに通知するには、(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");
  }
});

ここでの問題は、グローバル変数を使用できないことです。この問題で私を助けることができる人はいますか?

4

1 に答える 1

1

過去に同じ問題に直面したとき、シングルトン パターンを実装して、ユーザーの現在のセッションを「グローバル」に保つことにしました。このようにして、必要なクラスの現在のセッションにアクセスできます。

次のようになります。

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();
}

注:ここでこのメソッドを呼び出すと、イベント ディスパッチ スレッドで実行され、このメソッドが完了するまで GUI が「フリーズ」します。サーバーとのやり取りに時間がかかる場合は、これを別のスレッドで行うことをお勧めします。

于 2013-11-11T18:17:29.403 に答える