0

我有一个名为 CounterGUI 的对象。它创建了一个 GUI。我在另一个类中创建它,比如 MyProgram。

MyProgram 创建 CounterGUI 对象后,如何删除该对象?说如果我这样做:

CounterGUI first = new CounterGUI(); //displays the GUI
first = null;

我认为将对象设置为 null 会删除所有内容(包括 GUI),但事实并非如此。如何彻底删除?

我看不出这是一个重复的问题,以前的答案是将其设置为 null 或新对象,但这在这里不起作用。

4

4 回答 4

1

假设 CounterGUI 是一个java.awt.Window,那么:

  • 使窗口消失的方法是调用setVisible(false).

  • 将其与本机窗口完全断开的方法是调用dispose().

  • 一旦 Window 成为disposed,使其无法访问(例如,通过分配null给所有引用它的变量)将使其有资格进行垃圾收集。

null在可见时简单地分配Window将无效。一个可见的 Window 对象连接到各种阻止它被垃圾收集的东西。

于 2013-05-14T05:14:55.870 回答
1

Java 使用自动垃圾收集。当您将对象设置为 null 并且它是剩余的最后一个引用时,JVM 将回收使用的内存。

但是,在您的情况下,可能是创建了一个线程(使用 GUI,这通常是这种情况)并为其提供了对当前对象的引用。在这种情况下,将引用设置为 null 无效,因为其他东西仍然可以访问该对象。

为了正确关闭您的 GUI,您必须调用 close 方法。对于 JFrame,你可以试试这个:

myGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

当用户单击关闭按钮时,它将关闭应用程序。如果您想通过程序控制关闭,那么您可以尝试:

private void closeItDown() {
  WindowEvent event = new WindowEvent(this, WindowEvent.WINDOW_CLOSING);
  Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event);
}

...并调用此方法。您不必将任何内容设置为 null,此时 JVM 可能会为您收集垃圾。不能保证,但可能在这一点上,也许以后,或者现在......或者任何时候:)

于 2013-05-14T05:18:48.127 回答
0

你想让 GUI 消失然后dispose()

你不必担心这个,垃圾收集器会自动把它从内存中取出或者

你可以自己调用它

System.gc()

但这是不好的做法,也不能保证一定会被收集。

于 2013-05-14T05:10:23.707 回答
0
  1. 通过将对象的引用设置为 null 来删除对象,使其有资格进行垃圾收集,并且 JVM 将负责删除所有这些对象。如果你想强制垃圾收集器运行,你可以发出System.gc()Runtime.gc ()但仍然不能保证它会被收集回 JVM。您可以在此处找到有关垃圾收集器如何工作的更多信息

  2. 如果要删除 GUI 窗口,可以使用dispose()方法。

于 2013-05-14T05:20:54.583 回答