在退出Java中的JFrame和TCP通信之前关闭资源
1. 我正在编写一个基于TCP通信的聊天应用程序。 我使用的是NetBeans,我想在退出JFrame时为默认的EXIT_ON_CLOSE添加功能。 当然,原因是我想安全地清理资源和结束线程。 我如何调用一个方法来清除资源,然后才安全地关闭JFrame并结束进程 2. 我需要实现服务器端。服务器具有“Socket”列表/HashMap/队列及其聊天昵称。因为我不想重新发明轮子,所以有没有简单的设计模式可以正确地实现它 谢谢。对于第1点),设置在退出Java中的JFrame和TCP通信之前关闭资源,java,jframe,netbeans-6.9,serversocket,Java,Jframe,Netbeans 6.9,Serversocket,1. 我正在编写一个基于TCP通信的聊天应用程序。 我使用的是NetBeans,我想在退出JFrame时为默认的EXIT_ON_CLOSE添加功能。 当然,原因是我想安全地清理资源和结束线程。 我如何调用一个方法来清除资源,然后才安全地关闭JFrame并结束进程 2. 我需要实现服务器端。服务器具有“Socket”列表/HashMap/队列及其聊天昵称。因为我不想重新发明轮子,所以有没有简单的设计模式可以正确地实现它 谢谢。对于第1点),设置JFrame.setDefaultCloseOpera
JFrame.setDefaultCloseOperation(JFrame.DO\u NOTHING\u ON\u CLOSE)代码>,将窗口侦听器添加到框架中。在close方法中,添加功能以结束线程
s&清除资源
实现Runtime.addShutdownHook(Thread)
可能也会有好处。请注意,关闭钩子应该很快完成。第2点:当我编写一个类似的程序时,我创建了一个名为“Connection”的类,该类的成员包括一个套接字和一个字符串昵称。该类扩展了Thread类
因此,每当创建一个新套接字时,它都会被插入到这样一个对象中,然后该对象将作为一个单独的线程运行,侦听新消息。每当创建一个对象时,这些对象都会被插入到列表中,然后在用户注销时根据需要将其删除。在尝试了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) {}
});
您可以使用WindowAdapter类保存WindowListener接口所有方法的实现(它包括每个方法的空实现,因此您可以覆盖您关心的方法)
这样做的时候,我的窗户似乎永远不会关上。我该如何结束线程并清除窗口侦听器的close方法中的资源(如果该方法属于它的话)?我建议你问一个新问题,展示所用代码的一部分。是的,我听说它们神奇地解决了所有问题。“神奇地治愈一切”它还没有确保世界和平或结束饥饿,但接近治愈癌症
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.addWindowListener(new WindowAdapter()
{
@Override
public void windowClosing(WindowEvent we)
{
//Code goes here
}
});