加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java中的dispose()方法

(2009-01-22 21:58:36)
标签:

java

it

分类: IT技术

    这是我第100篇IT技术文章,也正好让我实现了一个完整的从客户端输入参数,使用遗传算法计算生产排程的实例,前端由客户输入种群大小,遗传代数,交叉概率,变异概率,零件数,机器数,时间矩阵,机器矩阵,经运算得出最小的排程时间和甘特图。爽啊。

    从读研起开始学习java至今也有2年多了,中间搞了很多其它的事情,真正花在java上面的时间又有多少,总觉得Java东西太多了,学不完,就连环境配置都占用了我很多时间,一步一步走过来,感觉也开始有点明白了,从开放性来说,java的东西确实更有包容性,不同于微软的一家之言,但是包容性灵活性也意味着复杂性,从环境配置就可以略见一二。但也加深了我对某些方面的了解。

    不多说,做个记号,留个纪念,在我200、300、甚至1000篇IT技术文章(当然有很多上转载的,但我都看了)的时候,再回头来看,那个时候应该是另一种境界了吧。

 

先来看看 JAVA 1.5 的帮助文档的原文 - dispose - public void dispose()

    释放由此 Window、其子组件及其拥有的所有子组件所使用的所有本机屏幕资源。即这些 Component 的资源将被破坏,它们使用的所有内存都将返回到操作系统,并将它们标记为不可显示。 通过随后对 pack 或 show 的调用重新构造本机资源,可以再次显示 Window 及其子组件。重新创建的 Window 及其子组件的状态在移除 Window 的点上与这些对象的状态将是一样的(不考虑这些操作之间的其他更改)。

注:当 Java 虚拟机 (VM) 中最后的可显示窗口被移除后,虚拟机可能会终止。

    实际上就是说明了两层意思: 1.使用dispose()方法关闭窗体会释放该窗体的占用的部分资源,不过呢不是全部的,如上面说的,只是屏幕资源。2.使用dispose()方法关闭的窗体可以使用pack 或 show 方法恢复,并且可以恢复到dispose前的状态(呵呵~感觉好神奇的,一开始都不相信)

    关于上面的还有几点要说明的就是:1.如果dispose掉最后的窗体(程序启动就显示的那个),程序将终止。2.在JDK1.5中,show方法已经过时,被setVisible(boolean)方法代替,不过,使用dispose()和setVisible()方法,在表象上没有任何区别,它们的实质区别在于setVisible方法仅仅隐藏窗体,而dispose方法是关闭窗体,并释放一部分资源。

 

呵呵~顺便写个程序,简单验证一下:

By Noel @ 程序员之家 // 验证dispose()方法,窗体是否能被正确还原

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/////////////////////////// MyFrame 主窗体 /////////////////////////////////

class MyFrame extends JFrame implements ActionListener {

JButton btnEvt=new JButton("生成窗体");

JButton btnEvt1=new JButton("恢复子窗体");

JTextArea txtArea =new JTextArea(5,15);

static int flag=0;

//标记子窗体是否被生成

subFrame subfrm;

public MyFrame() {

super("主窗体");

this.setBounds(20,20,300,200);

Container cPane=getContentPane();

cPane.setLayout(new FlowLayout());

//在按钮上添加监听器

cPane.add(btnEvt);

btnEvt.addActionListener(this);

cPane.add(btnEvt1);

btnEvt1.addActionListener(this);

this.addWindowListener(new WindowAdapter( ) {
public void windowClosing(WindowEvent e) { System.exit(0); } } );

this.setVisible(true);
}

//实现按钮中方法

public void actionPerformed(ActionEvent ae) {

if( flag==0 && (ae.getSource()).equals(btnEvt)) {

flag=1;

btnEvt.setEnabled(false);

subfrm=new subFrame(); //生成子窗体 }
}
else
{
subfrm.setVisible(true); //恢复子窗体 }
}
}
//测试用主函数
public static void main(String str[]) { MyFrame frm=new MyFrame(); } }

///////////////////////// 子窗体 //////////////////////////////


class subFrame extends JFrame {
JLabel lblsub=new JLabel("点击右上角关闭按钮关闭。");

//设置JRadioButton目的为了标记窗体状态 //检查是否能被正确还原

JRadioButton rbtn1=new JRadioButton("1");

JRadioButton rbtn2=new JRadioButton("2");

JRadioButton rbtn3=new JRadioButton("3");

public subFrame() {

super("子窗体");

this.setBounds(30,40,200,300);

Container cPane=getContentPane();

cPane.setLayout(new FlowLayout());

ButtonGroup bg =new ButtonGroup();

bg.add(rbtn1);

bg.add(rbtn2);

bg.add(rbtn3);

cPane.add(rbtn1);

cPane.add(rbtn2);

cPane.add(rbtn3);

cPane.add(lblsub);

this.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e) {

//可切换两种不同的方法,不过表象上两种方法运行时没有区别
subFrame.this.dispose();

//subFrame.this.setVisible(false);

} } );

//this.setVisible(true);
}

}

 

======================================================================================

我的理解是dispose是 java.awt.Windows类的方法,它的作用是销毁程序中指定的图形界面资源,对数据资源不产生影响,所以当我们在SWing或是AWT中的图形界面组件时如果调用它,组建内的数据对象不会消失,只有在这些数据资源其他地方没有再使用后才会由垃圾回收机制处理掉。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有