如何删除对话框引用的对象?

时间:2010-03-15 06:02:09

标签: java swing

我在其中创建了一个带有jpanel的对话框,如果我删除了对话框,仍然会引用jpanel。当我点击取消按钮时,我想破坏该对话框及其中的所有内容。如何删除对话框和jpanel?

8 个答案:

答案 0 :(得分:10)

回答您在comment

中提出的问题

显示对话框后:

setVisible(true);

通过调用隐藏它:

setVisible(false);

然后你必须打电话:

dialog.dispose();

确保释放所用对话框的所有本机GUI资源。完成此操作后,垃圾收集器将在您不再引用所有对象时清理所有对象。

答案 1 :(得分:5)

  1. 如果它是一个窗口并且是可见的

    予。 frame.setVisible(假);

    II。 frame.dispose();

    II。将引用设置为null(ex .. frame = null;)

  2. 如果它不是Window

    I.set引用null(ex .. x = null;)

  3. 就是这样,一旦对象被免费,GC就会释放资源

    以下是您必须了解的事情

    *。您作为Java程序员无法强制Java中的垃圾收集; 只有在JVM认为需要基于Java堆大小的垃圾收集时才会触发它。

    *。有一些方法,如 System.gc() Runtime.gc(),用于将垃圾收集请求发送到JVM,但不保证垃圾收集会发生。

    *。如果没有用于在堆中创建新对象的内存空间,则Java虚拟机会抛出OutOfMemoryError或java.lang.OutOfMemoryError堆空间

    搜索一下......

    J2SE 5(Java 2标准版)添加了一项名为人机工程学的新功能。人体工程学的目标是通过最少的命令行调整从JVM提供良好的性能。

答案 2 :(得分:4)

无需删除该对象。垃圾收集器会在不再引用内存后立即处理内存。

答案 3 :(得分:3)

您可以覆盖finalize()方法(请参阅http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#finalize%28%29)以在对象被销毁时执行清理。

但是,与C ++不同,无法保证何时调用此方法。在C ++中,您有堆栈存储的对象,当执行离开定义它们的作用域时会被销毁。

在Java中,所有对象都存储在堆上。当垃圾收集器决定收集它们时(意味着它们无法从您的应用程序访问),它们将被最终确定,但您不知道GC何时启动。因此,如果您必须进行某些清理,那么必须进行清理。 point(例如,关闭文件以便可以写入)你必须自己编写代码而不是依赖于调用的finalize()方法。

这样做的典型模式基于try ... finally块:

X x = null;
try {
  // ... do some stuff
  x = ... // obtain an object
   ... // do some stuff 
}
finally {
  if(x != null)
     x.close(); // Perform cleanup WRT x
}

(不可否认,丑陋)

答案 4 :(得分:2)

你的意思是“如何”摧毁它?没有办法在Java中显式地销毁对象。 Java中的垃圾收集器自动回收它占用的内存如果没有相同的引用存在。

  

“但我用jpanel创建对话框   在它内部,那jpanel将是   仍然参考。我想破坏   点击我自己的按钮时该对话框   “取消”

尝试将JPanel对象设置为null或在其上调用dispose方法(如果可用)。

答案 5 :(得分:2)

如果要删除将该对象引用赋值为null,那么当垃圾收集器下次运行时它可以销毁该对象,认为它没有被引用。

答案 6 :(得分:2)

没有必要像在C ++中那样以Java的方式销毁Java中的对象。在运行代码中没有对该对象的引用之后,垃圾收集器会自动销毁(释放内存使用的对象)。你可以做的一切就是强制销毁链接Object obj = null;这会杀死对象的引用。

答案 7 :(得分:1)

“System.gc()”是最好的方法。

gc-Garbage Collector。

这就是你要破坏程序本身的对象

示例代码:

public class TestRun
{
  public static void main(String args[])
  {
     /*1*/     TestRun tr=new TestRun(); 
     /*2*/     System.gc(); //You can omit this step. This is just an example. 
     /*3*/     tr=null;    
     /*4*/     System.gc();  
  }    
}

解释

  1. 创建TestRun类的对象,并将其引用存储在变量'tr'中。

  2. 调用垃圾收集器。但没有效果。因为尚未取消引用任何对象。

  3. 现在取消引用在步骤1中创建的对象。但是对象占用的空间仍然被它阻止。

  4. 再次调用垃圾收集器,现在它看到现在取消引用在步骤1中创建的对象。因此,现在它释放了对象占用的空间,现在用简单的语言将对象从内存中删除。

  5. 实际上它会删除所有已经解除引用的对象。

    在您的代码中继续调用它是一种很好的做法。