1

1. TCP 通信でチャット ベースのアプリケーションを作成しています。NetBeans を使用しており、JFrame を終了するときにデフォルトの EXIT_ON_CLOSE に機能を追加したいと考えています。その理由はもちろん、リソースをきれいにしてスレッドを安全に終了させたいからです。リソースをクリアしてから JFrame を安全に閉じてプロセスを終了するメソッドを呼び出すにはどうすればよいですか。

2. サーバー側を実装する必要があります。サーバーには、チャットのニックネームを含む「ソケット」のリスト/ハッシュマップ/キューがあります。私は車輪を再発明したくないので、それを正しく行うための簡単なデザインパターンはありますか?

ありがとう。

4

4 に答える 4

1

WindowAdapterクラスを使用すると、WindowListenerインターフェイスのすべてのメソッドの実装を節約できます(各メソッドの空の実装が含まれているため、気になるメソッドをオーバーライドできます)。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
    @Override
    public void windowClosing(WindowEvent we)
    {
        //Code goes here
    }
});
于 2013-01-15T11:21:58.980 に答える
1

この問題を自分で解決しようとしてアンドリューの提案を試みた後、これが私がしたことです。私の場合、tcp 通信を閉じている間、データをデータベースに保存しています。ウィンドウを閉じてからプログラムが実際に閉じるまでの間に、やらなければならない作業があります。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowListener() {            
    @Override
    public void windowOpened(WindowEvent e) {
        // TODO Load all data here                
    }
    @Override public void windowClosing(WindowEvent e) {
        // TODO Save the data
    }

    @Override public void windowIconified(WindowEvent e) {}            
    @Override public void windowDeiconified(WindowEvent e) {}            
    @Override public void windowDeactivated(WindowEvent e) {}            
    @Override public void windowActivated(WindowEvent e) {}
    @Override public void windowClosed(WindowEvent e) {}
});
于 2012-03-20T17:26:19.967 に答える
0

1) については、 を設定し、フレームJFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);に を追加しWindowListenerます。Threadclose メソッドに、 s を終了してリソースをクリアする機能を追加します。

実装するのにもお金がかかるかもしれませんRuntime.addShutdownHook(Thread)。シャットダウン フックはすぐに完了する必要があることに注意してください。

于 2011-04-16T22:41:26.890 に答える
0

ポイント 2: 同様のプログラムを作成したとき、メンバーとしてソケットと文字列のニックネームを含む「Connection」というクラスを作成しました。このクラスは Thread クラスを拡張したものです。

そのため、新しいソケットが作成されるたびに、そのようなオブジェクトに挿入され、別のスレッドとして実行され、新しいメッセージをリッスンします。これらのオブジェクトは、リストが作成されるたびにリストに挿入され、ユーザーがサインオフしたときに適切に削除されました。

于 2011-04-16T23:03:13.960 に答える