首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:从GUI中删除GUI对象

Java:从GUI中删除GUI对象
EN

Stack Overflow用户
提问于 2010-02-08 16:25:44
回答 3查看 2.2K关注 0票数 1

你能帮帮我吗?一个非常简单的问题,但我就是不知道解决方案是什么!

我正在编写一个侦听器应用程序,它在自己的线程上运行,并在ServerSocket上侦听传入的连接。

当一个连接到达时,在一个新线程上创建一个新的'Message‘对象,并将传入的文本数据"messageData“传递给它。然后,此对象应在弹出窗口中向用户显示文本。

在Listener.java中:

代码语言:javascript
复制
javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() {

        Message.display(messageData);

    }
});

然后,在Message.java中:

代码语言:javascript
复制
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是非法的。

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

非常感谢

将要

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-02-08 16:50:09

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

看一看tutorial

票数 4
EN

Stack Overflow用户

发布于 2010-02-08 16:46:04

您不能强制从内存中删除对象,但dispose方法可能就是您要删除图形用户界面的方法:

代码语言:javascript
复制
// close GUI
javax.swing.SwingUtilities.invokeLater(new Runnable() {

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

这里假设您的GUI类扩展了JDialogJFrame

票数 1
EN

Stack Overflow用户

发布于 2010-02-08 16:58:09

如果你有一个弹出式窗口,那么你在某处就有一个框架。框架是顶层对象,即使没有人保留对它们的引用也会存在(嗯,VM可能会这样做,但您不必这样做)。

因此,解决方案是等待单击弹出窗口中的OK或close按钮,然后将其清除。不要在任何地方保留对弹出窗口的引用,VM会为您清理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2220303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档