【问题标题】:Java: Deleting a GUI object from within the GUIJava:从 GUI 中删除 GUI 对象
【发布时间】: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


    【解决方案1】:

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

    看看tutorial

    【讨论】:

    • 是的,这可能是目前最好的方法
    【解决方案2】:

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

    // close GUI
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
    
        public void run() {
            gui.dispose();
        }
    });
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2014-01-24
        相关资源
        最近更新 更多