【问题标题】:Destroy instance of class then create instance of it again销毁类的实例然后再次创建它的实例
【发布时间】:2013-04-27 21:38:04
【问题描述】:

我有一个包含按钮的类(Class ButtonX)

当用户点击按钮时,它会创建类DialogX的实例

当我创建 DialogX 类的实例时,它会显示 JDialog

  public class ButtonX {

    public ButtonX() {
        JFrame me = new JFrame();
        JButton n = new JButton("show dialog");
        n.addActionListener(ListenerX.listen);
        me.getContentPane().add(n);
        me.pack();
        me.setVisible(true);
    }

    public static void main (String[]args){
        new ButtonX();
    }
}

JButton的听众

    public class ListenerX {
    public static ActionListener listen = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            DialogX dialogx = null;
            dialogx = new DialogX();
        }};
}

包含JDialog的类

 public class DialogX {
    static JDialog g = new JDialog();
    public DialogX() {
        JLabel label = new JLabel("label");
        g.getContentPane().setLayout(new FlowLayout());
        g.getContentPane().add(label);
        g.pack();
        g.setModalityType(Dialog.ModalityType.APPLICATION_MODAL);
        g.setVisible(true);
    }

}

我试图实现的是,当用户单击按钮时,它将销毁类 DialogX 的实例(如果存在),然后再次创建 DialogX 的实例

怎么办?

谢谢..

原谅我的英语..

【问题讨论】:

  • 你的问题是什么
  • @GuillaumePolet 每次用户单击按钮时我都需要创建一个新的 JDialogX 实例。但根据我的帖子代码,(我认为)它不会创建一个新的实例。总是有 1 个 JLabel 但它没有.. JDialog 每次用户单击按钮时总是再次添加一个新的 JLabel..
  • 去掉JDialog g = new JDialog();前面的static
  • 是的,您可以采取不同的做法,但通常使用static 表示设计不佳或对编程概念理解不佳。 static 是 Java 中万恶之源(常量除外),所以尽量远离。
  • 使用static 实际上会阻止垃圾收集器清理该引用。 static 经常导致内存泄漏(因此它是万恶之源)。我只能建议您阅读更多关于statickeyword 含义的信息

标签: java swing components awt


【解决方案1】:

您不能在 Java 中显式销毁对象。一旦不再有对 Object 的引用(想想指针),它将被标记为符合垃圾收集条件。因此,您的代码几乎没问题,因为它删除了对 DialogX 实例的旧引用并创建了一个新引用。 您需要做的是使用您的 DialogX 类扩展 JDialog(然后您可以完全删除 JDialog 变量)或删除 JDialog 变量 g 之前的 static 关键字。然后你可以调用dialogx.dispose()(你扩展了JDialog)或你需要实现的自定义方法,它将调用转发到g.dispose()(你没有扩展JDialog)。

【讨论】:

  • 无需扩展JDialog,因为您没有向其添加行为。删除 static 关键字就足够了,但这已经说过了。
猜你喜欢
  • 1970-01-01
  • 2021-06-26
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-30
相关资源
最近更新 更多