我在其中创建了一个带有jpanel的对话框,如果我删除了对话框,仍然会引用jpanel。当我点击取消按钮时,我想破坏该对话框及其中的所有内容。如何删除对话框和jpanel?
答案 0 :(得分:10)
回答您在comment:
中提出的问题显示对话框后:
setVisible(true);
通过调用隐藏它:
setVisible(false);
然后你必须打电话:
dialog.dispose();
确保释放所用对话框的所有本机GUI资源。完成此操作后,垃圾收集器将在您不再引用所有对象时清理所有对象。
答案 1 :(得分:5)
如果它是一个窗口并且是可见的
予。 frame.setVisible(假);
II。 frame.dispose();
II。将引用设置为null(ex .. frame = null;)
如果它不是Window
I.set引用null(ex .. x = null;)
就是这样,一旦对象被免费,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();
}
}
解释
创建TestRun类的对象,并将其引用存储在变量'tr'中。
调用垃圾收集器。但没有效果。因为尚未取消引用任何对象。
现在取消引用在步骤1中创建的对象。但是对象占用的空间仍然被它阻止。
再次调用垃圾收集器,现在它看到现在取消引用在步骤1中创建的对象。因此,现在它释放了对象占用的空间,现在用简单的语言将对象从内存中删除。
实际上它会删除所有已经解除引用的对象。
在您的代码中继续调用它是一种很好的做法。