【问题标题】:Garbage Collector for GUI elementsGUI 元素的垃圾收集器
【发布时间】:2012-02-12 09:27:54
【问题描述】:

我无法理解以下代码:

import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;

public class A
{
      public A(){
        JFrame myframe = new JFrame ("hz window");
        myframe.setLayout(new GridLayout ());
        myframe.setSize(new Dimension (500, 200));
        myframe.setVisible(true);
    }

    public static void main (String arg[]){
        new A();
        //  System.gc();                          //1
          //Runtime.getRuntime().gc();            //2
    }
}

myframe对象的作用域是A类的构造函数吧?

那么,为什么窗口没有消失(即在第 1 行和第 2 行被垃圾收集器移除)

我们在java程序中创建的所有gui元素的范围是什么?

JVM 将所有指向应用程序 gui 对象的链接保存在哪里?

对于新手问题,我很抱歉。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    Swing 保持对每个窗口对象的引用,直到它们被用户关闭或使用dispose() 函数强制处理。否则,您会看到神秘消失的 GUI 元素。

    【讨论】:

      【解决方案2】:

      Swing 代码执行的 EventDispatchThread。

      【讨论】:

        【解决方案3】:

        Top-Level Containers 从未从 JVM 内存中消失,也无法被释放或 GC,因为:

        • API 中缺少 finalize 方法,

        • 顶级容器来自 Native OS,

        • 只能对其 Graphics(2D) 进行垃圾处理(删除其内容后),然后只有空容器,

        • 直到当前的 JVM 实例存在,然后你才能重新使用这个/这些容器,更多 here

        【讨论】:

          【解决方案4】:

          使用方法 dispose 关闭 Jframe 所以如果你想关闭你就是 jframe juste 这样做

          public static void main (String arg[]){
              Jframe a = new A();
              //do what ever you want and when it's done
          
              a.dispose();
          }
          

          垃圾收集器在java中不是用来关闭所有东西的,而jframe在它自己的线程中,所以确定它是否需要擦除很复杂。

          另外,JFrame 是一个独立的线程,通常通过点击框架右上角的 X 来关闭它,因此更好的解决方案可能是设置该动作的默认行为为 dispose

          public A(){
              JFrame myframe = new JFrame ("hz window");
              myframe.setLayout(new GridLayout ());
              myframe.setSize(new Dimension (500, 200));
              myframe.setVisible(true);
              myframe.setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
          }
          

          但这取决于你想对你的框架做什么。

          【讨论】:

            猜你喜欢
            • 2018-12-30
            • 1970-01-01
            • 2011-11-07
            • 2013-04-01
            • 2012-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多