【发布时间】:2011-01-14 06:52:33
【问题描述】:
你能帮帮我吗?一个非常简单的问题,但我就是不知道解决方案是什么!
我正在编写一个在其自己的线程上运行并在 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 对象最初通过静态 Message.display() 方法创建自己。这意味着可以有无限的 Message 对象,它们都独立存在,Listener 不必担心管理它们。
太好了。但是我现在有一个问题。
当用户在 GUI 上单击“确定”时,我希望 (a) 删除/隐藏 GUI,以及 (b) 从内存中删除消息对象。
我该怎么做(a)和(b)?我可以(a)通过
gui=null in gui.addOKListener()(见上文)但我不能做 (b),因为我没有对 Message 对象的引用。
我试图在 Message.display() 中定义 addOKListener() 但这不起作用,因为我必须将我创建的 message 对象设为 final,因此 message=null 是非法的。
一个非常简单的问题-我猜解决方案也很简单。这很令人沮丧..
非常感谢
会
【问题讨论】:
标签: java multithreading user-interface swing oop