2011-04-16 74 views
1

1. 我正在寫一個基於聊天的TCP通信應用程序。 我正在使用NetBeans,並且我想在退出JFrame時將功能添加到默認EXIT_ON_CLOSE。 當然是因爲我想清理資源並安全地結束線程。 如何調用清除資源的方法,然後才能安全關閉JFrame並結束該過程。在Java中退出JFrame和TCP通信之前關閉資源

2. 我需要實現服務器端。服務器具有帶有聊天暱稱的'Socket'的List/HashMap/Queue。是否有任何簡單的設計模式可以正確執行,因爲我不想重新發明車輪。

謝謝。

回答

0

對於點1),設置JFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);,將一個WindowListener添加到框架。在關閉方法中,添加功能以結束清除資源的Thread s &。

它也可能支付實施Runtime.addShutdownHook(Thread)。請注意,關閉掛鉤應該很快完成。

+0

當這樣做時,似乎我的窗戶從不關閉。我該如何去結束線程並清除窗口監聽器的close方法中的資源(如果它甚至屬於它的話)? – corsiKa 2012-03-20 17:02:01

+0

我建議你問一個新問題,顯示所用代碼的[SSCCE](http://sscce.org/)。 – 2012-03-20 18:01:25

+0

是的,我聽到那些奇蹟般地治好了一切。我會接受的。 – corsiKa 2012-03-20 19:04:08

0

對於第2點:當我編寫了一個類似的程序時,我創建了一個名爲「Connection」的類,它包含一個套接字和一個字符串暱稱作爲成員。該類擴展了Thread類。

因此,無論何時創建一個新的套接字,它都會被插入這樣一個對象,然後它將作爲一個單獨的線程運行,偵聽新的消息。無論何時創建這些對象,都會將這些對象插入到列表中,然後在用戶簽出時將其刪除。

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) {} 
}); 
1

可以使用WindowAdapter的類來保存實現WindowListener的接口(它包括一個空實現各種方法的,所以你可以重寫你關心的)的所有方法。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
frame.addWindowListener(new WindowAdapter() 
{ 
    @Override 
    public void windowClosing(WindowEvent we) 
    { 
     //Code goes here 
    } 
});