2010-02-08 95 views
1

你能幫我解決嗎?一個非常簡單的問題,但我無法得到解決方案!Java:從GUI中刪除GUI對象

我正在編寫一個在其自己的線程上運行的偵聽器應用程序&在ServerSocket上偵聽傳入連接。

當連接到達時,在新線程上創建一個新的「消息」對象,並傳入傳入的文本數據「messageData」。然後該對象應該在彈出窗口中向用戶顯示文本。

在Listener.java:

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 

     Message.display(messageData); 

    } 
}); 

然後,在Message.java:

public Message { 

    public static void display(String data) { 

     Message message = new Message(data); 

     message.initGUI(); 

    } 

    String messageData; 

    GUI gui; 

    public Message(String data) { 

     messageData = data; 

     gui = new GUI(); 

    } 

    public void initGUI() { 

     gui.init(); 

     // add listeners 
     gui.addOKListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 

       // close GUI 
       javax.swing.SwingUtilities.invokeLater(new Runnable() { 

        public void run() { 
         gui.close(); 
        } 
       }); 

       gui = null; 

      } 
     }); 

    } 

    public class GUI { 
     do GUI stuff 
     ... initialise gui 
     ... add components 
     ... setVisible=true 
    } 
} 

的想法是,內部類GUI是 '查看' 和該消息對象是模型和控制器相結合。

每個消息對象最初通過靜態Message.display()方法創建自己。這意味着可以獨立存在無限的Message對象,並且Listener不必擔心管理它們。

太好了。不過,我現在有一個問題。

當用戶在GUI上點擊'OK'時,我想要(a)刪除/隱藏GUI,以及(b)要從內存中刪除的消息對象。

我該怎麼辦(a)和(b)?我可以做(a) gui=nullgui.addOKListener()(見上面),但我不能做(b)因爲我沒有對Message對象的引用。

我試圖在Message.display()中定義addOKListener(),但這不起作用,因爲我必須使message對象創建最終,因此message=null是非法的。

一個非常簡單的問題 - 我猜解決方案也很簡單。這是非常令人沮喪..

非常感謝

威爾

回答

4

如果您只想顯示一個包含簡短測試消息的對話框,那麼使用JOptionPane和其中一種靜態工廠方法會更容易。

看一看在tutorial

+0

是的,這可能是目前最好的方法 – Imme22009 2010-02-10 14:45:16

1

你不能強迫對象從內存中刪除,但dispose方法可能是你在找什麼,除去GUI:

// close GUI 
javax.swing.SwingUtilities.invokeLater(new Runnable() { 

    public void run() { 
     gui.dispose(); 
    } 
}); 

這是假設你GUI類擴展JDialogJFrame

1

如果你有一個彈出窗口,那麼你有一個框架的地方。即使沒有人保留對它們的引用,框架也是頂級對象(也就是說,虛擬機可能不會但不需要)。

因此,解決方案是等待彈出窗口上的確定或關閉按鈕的點擊,然後將其處置。不要將引用保留在任何位置,並且虛擬機將爲您清理。