黑马程序员技术交流社区

标题: 关于GUI中关闭窗口 [打印本页]

作者: 高会仁    时间: 2012-12-15 12:04
标题: 关于GUI中关闭窗口
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class AwtDemo {
/**
  * @param args
  */
private Frame f;
private Button b;

AwtDemo(){
  init();
}

public void init(){
  //对frame进行基本设置。
  f = new Frame("my awt");
  f.setSize(400, 500);
  f.setLocation(100, 60);
  f.setLayout(new FlowLayout());
  
  b = new Button("按钮");
  //将组件添加到frame中
  f.add(b);
  //加载窗体事件
  method();
  //显示窗体;
  f.setVisible(true);
  
}
/**
  * 窗体事件
  * */
public void method(){
  f.addWindowListener(new WindowAdapter(){
   public void windowClosing(WindowEvent e){
    System.out.println("关闭窗口");
    System.exit(0);//写成f.dispose();
   }
  });
  b.addActionListener(new ActionListener(){
   public void actionPerformed(ActionEvent e) {
    System.out.println("点击按钮关闭);
    System.exit(0);
   }
   
  });
}
public static void main(String[] args) {
  
  new AwtDemo();
  
}
}
如红色标记,写成f.dispose()和写成System.exit(0);都能达到释放资源关闭窗口的效果,这两者有什么区别么,用哪种更好??

作者: Spring up    时间: 2012-12-15 12:23
System.exit(0);是系统关闭,也就是你的平台虽然关闭了,但在你的内存还是占有着,
dispose();是释放资源,也就将你的平台从内存中释放!
作者: 高会仁    时间: 2012-12-16 11:31
Spring up 发表于 2012-12-15 12:23
System.exit(0);是系统关闭,也就是你的平台虽然关闭了,但在你的内存还是占有着,
dispose();是释放资源, ...

也就是说dispose()释放的更彻底?
作者: 梁小波    时间: 2012-12-16 12:01
我觉得楼上的说法恰恰相反!不知道为什么会被加分?
exit是System的静态方法,api中明确写道: 终止当前正在运行的 Java 虚拟机!
而dispose()方法是window的方法。api中为:释放由此 Window、其子组件及其拥有的所有子组件所使用的所有本机屏幕资源!

就先说两者的区别:
1.exit()是释放jvm,你可以想一下,jvm是一切java程序运行的基础,jvm都停掉了,还能干什么?而楼上说内存还占有着,不知是说的什么内存?总之,不可能是java程序或jvm的内存!
2.dispose()是释放本窗口的资源,也就是谁调用了dispose(),谁就没有了资源,我们知道,每一个窗口都是一个线程管理的,所以该窗口调用dispose后这些线程和相关资源都没有了。但是其他的窗口还在!程序不会退出!而二楼的平台释放,也是不可能的事情!

所以呢,其实这两个函数用法是不同的!也就是说在GUI程序中建立了很多窗口程序,你要停止一个窗口,就用dispose(),这样其他窗口还在!如果想退出程序,用exit这样整个程序都终止了!一般多窗口程序关闭某个窗口用的是dispose().
作者: 高会仁    时间: 2012-12-16 16:50
梁小波 发表于 2012-12-16 12:01
我觉得楼上的说法恰恰相反!不知道为什么会被加分?
exit是System的静态方法,api中明确写道: 终止当前正 ...

嗯,你说的挺有道理的。谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2