Java对话框不处理

Java noob在这里.当用户按下Windows关闭按钮时,扩展JDialog的Swing类不会释放-java.exe保留在内存中.我已经将代码剥离到了这个shell上,但我仍然可以做到这一点.

我看了其他样本,例如Basic Java Swing, how to exit and dispose of your application/JFrame
当我注释掉该示例代码中的两行System.exit(0)时,该示例中的类仍然正确放置.我想让我的班级丢掉什么?

import javax.swing.JFrame;
import javax.swing.JDialog;
public class WhyNoDispose extends JDialog{
    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                try {
                    WhyNoDispose frame = new WhyNoDispose("my title");
                    frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                    frame.setVisible(true);
                    //System.exit(0);
                }
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public WhyNoDispose(String title) {
        super(new JFrame(title), ModalityType.APPLICATION_MODAL);
        pack();
    }
}

解决方法:

您正在创建一个JFrame,并且从不将其放置在这里:

public WhyNoDispose(String title) {
    super(new JFrame(title), ModalityType.APPLICATION_MODAL); // *********
    pack();
}

因此,由于JFrame处于活动状态并且GUI已呈现,因此Swing事件线程将继续运行.

如果改为使JFrame起作用,以使程序在JFrame关闭时退出,然后显式处置JFrame,则程序现在退出:

import java.awt.Window;

import javax.swing.JFrame;
import javax.swing.JDialog;

public class WhyNoDispose extends JDialog {
   public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            try {
               WhyNoDispose frame = new WhyNoDispose("my title");
               frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
               JFrame win = (JFrame) frame.getOwner();
               win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               frame.setVisible(true);
               win.dispose();
               // System.exit(0);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }

   public WhyNoDispose(String title) {
      super(new JFrame(title), ModalityType.APPLICATION_MODAL);
      pack();
   }
}

但这至少可以说是非常笨拙的代码-如果拥有的窗口不是JFrame怎么办?如果为空怎么办?

另一个解决方案是根本不使用JFrame,这样在处置JDialog时,就不会再留有任何持久化窗口来使事件线程持久化:

import java.awt.Window;

import javax.swing.JFrame;
import javax.swing.JDialog;

public class WhyNoDispose extends JDialog {
   public static void main(String[] args) {
      javax.swing.SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            try {
               WhyNoDispose frame = new WhyNoDispose("my title");
               frame.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
               frame.setVisible(true);
            } catch (Exception e) {
               e.printStackTrace();
            }
         }
      });
   }

   public WhyNoDispose(String title) {
      super((JFrame)null, title);
      pack();
   }
}
上一篇:java-如何使模态JDialog在显示后立即执行代码


下一篇:java-自动关闭Jdialog,无需用户操作