1

1. 我正在编写一个基于 TCP 通信的聊天应用程序。我正在使用 NetBeans,我想在退出 JFrame 时向默认的 EXIT_ON_CLOSE 添加功能。原因当然是因为我想安全地清理资源和结束线程。如何调用清除资源的方法,然后才能安全地关闭 JFrame 并结束进程。

2. 我需要实现服务端。服务器具有“套接字”的列表/哈希映射/队列及其聊天昵称。是否有任何简单的设计模式可以正确地做到这一点,因为我不想重新发明轮子。

谢谢。

4

4 回答 4

1

在尝试了 Andrew 的建议以尝试自己解决这个问题之后,这就是我所做的。就我而言,我正在将数据保存到数据库中,而您正在关闭 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 回答
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 回答
0

对于第 2 点:当我编写一个类似的程序时,我创建了一个名为“Connection”的类,其中包括一个套接字和一个字符串昵称作为成员。该类扩展了 Thread 类。

因此,无论何时创建一个新的套接字,它都会被插入到这样一个对象中,然后该对象将作为一个单独的线程运行,监听新消息。这些对象在创建时插入到列表中,然后在用户注销时酌情删除。

于 2011-04-16T23:03:13.960 回答
0

对于第 1) 点,设置JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);, 添加 aWindowListener到框架。在 close 方法中,添加结束Threads 和清除资源的功能。

实施Runtime.addShutdownHook(Thread). 请注意,关闭挂钩应该很快完成。

于 2011-04-16T22:41:26.890 回答