Закройте ресурсы перед выходом из JFrame и связи TCP в Java - PullRequest
1 голос
/ 17 апреля 2011

1. Я пишу приложение для чата по TCP-коммуникации.Я использую NetBeans и хочу добавить функциональность к стандартному EXIT_ON_CLOSE при выходе из JFrame.Причина, конечно, в том, что я хочу очистить ресурсы и завершить потоки безопасно.Как я могу вызвать метод, который очищает ресурсы и только затем безопасно закрывает JFrame и завершает процесс.

2. Мне нужно реализовать на стороне сервера.На сервере есть список / HashMap / очередь 'Socket' с их псевдонимами в чате.Есть ли простой шаблон дизайна, чтобы сделать это правильно, потому что я не хочу заново изобретать колесо.

спасибо.

Ответы [ 4 ]

1 голос
/ 15 января 2013

Вы можете использовать класс WindowAdapter для сохранения реализации всех методов интерфейса WindowListener (он включает в себя пустую реализацию каждого метода, поэтому вы можете переопределить те, которые вам нужны).

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
    @Override
    public void windowClosing(WindowEvent we)
    {
        //Code goes here
    }
});
1 голос
/ 20 марта 2012

После попытки предложить Эндрю попытаться решить эту проблему самостоятельно, вот что я сделал. В моем случае я сохраняю данные в базу данных, пока вы закрываете протокол 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) {}
});
0 голосов
/ 17 апреля 2011

Для пункта 2: Когда я писал похожую программу, я создал класс под названием «Соединение», который включал в качестве членов сокет и псевдоним строки.Класс расширил класс Thread.

Таким образом, всякий раз, когда был создан новый сокет, он вставлялся в такой объект, который затем выполнялся бы как отдельный поток, прослушивая новые сообщения.Эти объекты вставлялись в список всякий раз, когда он был создан, а затем удалялись соответствующим образом при выходе пользователя из системы.

0 голосов
/ 17 апреля 2011

Для пункта 1), установите JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);, добавьте WindowListener к кадру.В методе close добавьте функциональность, чтобы завершить Thread s и очистить ресурсы.

Также может быть полезно реализовать Runtime.addShutdownHook(Thread).Обратите внимание, что отключающий крюк должен завершиться быстро.

...