Java:从GUI中删除GUI对象

时间:2010-02-08 08:25:44

标签: java multithreading user-interface swing oop

你可以帮帮我吗?一个非常简单的问题,但我无法得到解决方案!

我正在编写一个运行在自己的线程上的侦听器应用程序。在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>

一个非常简单的问题 - 我猜这个解决方案也很简单。这非常令人沮丧..

非常感谢

威尔

3 个答案:

答案 0 :(得分:4)

如果您要做的只是向用户显示一个带有简短测试消息的对话框,那么如果您使用了JOptionPane和其中一个静态工厂方法,那么应该会容易得多。

查看tutorial

答案 1 :(得分:1)

您不能强制从内存中删除对象,但dispose方法可能是您要删除GUI的方法:

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

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

这假设您的GUI课程延伸JDialogJFrame

答案 2 :(得分:1)

如果你有一个弹出窗口,那么你就有了一个框架。框架是顶级对象,即使没有人保留对它们的引用也是存在的(好吧,VM可能会做但不需要)。

所以解决方法是等待点击弹出窗口的OK或关闭按钮然后处理它。不要在任何地方保留对弹出窗口的引用,VM将为您清理。