Java:从GUI中删除GUI对象

14 浏览
0 Comments

Java:从GUI中删除GUI对象

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

我正在编写一个监听器应用程序,它在自己的线程上运行,并在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.addOKListener() 中添加 gui=null 来做到 (a)(请参见上文),但是我无法做到 (b),因为我没有引用 Message 对象。

我曾尝试在 Message.display() 中定义 addOKListener(),但这样做不起作用,因为我必须将创建的 message 对象设置为 final,因此 message=null 是不合法的。

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

非常感谢

Will

admin 更改状态以发布 2023年5月21日
0
0 Comments

你不能强制从内存中删除对象,但 dispose 方法可能是你想要用来移除 GUI 的:

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

这假设你的 GUI 类扩展自 JDialogJFrame

0
0 Comments

如果你只是想向用户展示一个简短的测试信息对话框,使用JOptionPane的一个静态工厂方法会更容易一些。

请查看教程

0