你能帮帮我吗?一个非常简单的问题,但我就是不知道解决方案是什么!
我正在编写一个侦听器应用程序,它在自己的线程上运行,并在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.display()方法创建自身。这意味着可以有无限的消息对象,所有消息对象都独立存在,侦听器不必担心如何管理它们。
太棒了。然而,我现在有一个问题。
当用户单击GUI上的'OK‘时,我希望(a)删除/隐藏GUI,以及(b)从内存中删除消息对象。
我应该怎样做(a)和(b)?我可以(a)在gui.addOKListener()中使用gui=null (见上),但我不能(b),因为我没有对Message对象的引用。
我曾尝试在Message.display()中定义addOKListener(),但这行不通,因为我必须使我创建的message对象成为最终对象,因此message=null是非法的。
一个非常简单的问题--我猜解决方案也很简单。这是非常令人沮丧的。
非常感谢
将要
发布于 2010-02-08 16:50:09
如果您想要做的只是向用户显示一个带有简短测试消息的对话框,那么使用JOptionPane和其中的一个静态工厂方法应该会容易得多。
看一看tutorial
发布于 2010-02-08 16:46:04
您不能强制从内存中删除对象,但dispose方法可能就是您要删除图形用户界面的方法:
// close GUI
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui.dispose();
}
});这里假设您的GUI类扩展了JDialog或JFrame
发布于 2010-02-08 16:58:09
如果你有一个弹出式窗口,那么你在某处就有一个框架。框架是顶层对象,即使没有人保留对它们的引用也会存在(嗯,VM可能会这样做,但您不必这样做)。
因此,解决方案是等待单击弹出窗口中的OK或close按钮,然后将其清除。不要在任何地方保留对弹出窗口的引用,VM会为您清理。
https://stackoverflow.com/questions/2220303
复制相似问题