我正在编写一个运行在自己的线程上的侦听器应用程序。在ServerSocket上侦听传入连接。
当连接到达时,将在新线程上创建一个新的“Message”对象,并传入传入的文本数据“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对象是模型和控制器的组合。
每个Message对象最初都是通过静态Message.display()
方法创建的。这意味着可以独立存在无限制的Message对象,并且Listener不必担心管理它们。
大。但是我现在有一个问题。
当用户在GUI上单击“确定”时,我希望(a)删除/隐藏GUI,以及(b)从内存中删除的Message对象。
我如何做(a)和(b)?我可以做(一)
gui=null
中的gui.addOKListener()
(见上文)但我不能(b)因为我没有对Message对象的引用。
我试图在Message.display()
中定义addOKListener(),但这不起作用,因为我必须创建我创建的message
对象,因此message=null
是非法的。 / p>
一个非常简单的问题 - 我猜这个解决方案也很简单。这非常令人沮丧..
非常感谢
威尔
答案 0 :(得分:4)
如果您要做的只是向用户显示一个带有简短测试消息的对话框,那么如果您使用了JOptionPane和其中一个静态工厂方法,那么应该会容易得多。
查看tutorial
答案 1 :(得分:1)
您不能强制从内存中删除对象,但dispose
方法可能是您要删除GUI的方法:
// close GUI
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui.dispose();
}
});
这假设您的GUI
课程延伸JDialog
或JFrame
答案 2 :(得分:1)
如果你有一个弹出窗口,那么你就有了一个框架。框架是顶级对象,即使没有人保留对它们的引用也是存在的(好吧,VM可能会做但你不需要)。
所以解决方法是等待点击弹出窗口的OK或关闭按钮然后处理它。不要在任何地方保留对弹出窗口的引用,VM将为您清理。