新手问题,关于内存的

barryhappy 2010-08-10 02:36:16
我在写一个扫雷程序,在踩到雷之后让用户选择是否重新开始,
当用户选择是时,我的想到的一个做法是将当前的界面隐藏 setVisible(false) ,然后重新开始调用类绘制一个新的界面。
这样做功能是实现了,但是我感觉很不妥……因为前面一个界面只是隐藏了,应该还在占用内存……
有没有类似销毁之类的方法,将前一个界面KILL掉,不再占内存?
菜鸟学飞,请轻砸~~~
...全文
138 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
barryhappy 2010-08-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 silence_smile 的回复:]

引用楼主 barryhappy 的回复:
一个做法是将当前的界面隐藏 setVisible(false) ,然后重新开始调用类绘制一个新的界面。

要省内存就不要重新开一个界面啊!重新开始就在原来的窗口里从头开始不行么?要是重开一个的话,如果用户重新开始100次,不是肯定会挂掉?
[/Quote]
好吧~~
bekeer 2010-08-10
  • 打赏
  • 举报
回复
重新画 窗口不变 只把内容重新画回到开始的样子
Silence_Smile 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用楼主 barryhappy 的回复:]
一个做法是将当前的界面隐藏 setVisible(false) ,然后重新开始调用类绘制一个新的界面。
[/Quote]
要省内存就不要重新开一个界面啊!重新开始就在原来的窗口里从头开始不行么?要是重开一个的话,如果用户重新开始100次,不是肯定会挂掉?
barryhappy 2010-08-10
  • 打赏
  • 举报
回复
谢谢……不过用了dispose()之后,重新开始好像占用的内存还是显著地增减,而且貌似跟用setVisible()差别不大……
除了这个方法,还有其他的吗?
laotanle 2010-08-10
  • 打赏
  • 举报
回复
新手,刚进来,看看!
xiaohongboabcd 2010-08-10
  • 打赏
  • 举报
回复
dispose()
Silence_Smile 2010-08-10
  • 打赏
  • 举报
回复
这是我第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中的图形界面组件时如果调用它,组建内的数据对象不会消失,只有在这些数据资源其他地方没有再使用后才会由垃圾回收机制处理掉。
来自http://blog.sina.com.cn/s/blog_4afe685f0100c7x8.html
Silence_Smile 2010-08-10
  • 打赏
  • 举报
回复
dispose()?
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据到EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据到EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。
jackson所需要的所有jar jackson-all-1.6.2.jar jackson-core-asl-1.6.2.jar jackson-mapper-asl-1.6.2.jar jakarta-oro.jar 1. 背景 目前维护的产品使用jackson处理json,现整理一下jackson相关资料,希望对初次接触jackson的新手有所帮助。 jackson主页: http://jackson.codehaus.org/ jackson document: http://wiki.fasterxml.com/JacksonJavaDocs JacksonInFiveMinutes: http://wiki.fasterxml.com/JacksonInFiveMinutes 本文主要内容译自JacksonInFiveMinutes,增加了部分示例,转载请注明出处。 受java平台上各种处理xml的类库(StAX, JAXB等)启发,Jackson提供一种处理json的java类库。Jackson的目标是为开发者提供快速、准确、轻量级和用起来最爽的json处理类库。本文将概括介绍Jackson的主要功能和相关功能的使用示例。 2. 使用方式 Jackson提供三种可选的json处理方式: 1) Streaming API 又称Incremental parsing/generation, 受StAX API启发,以非关联递增方式读写json内容。 通过 org.codehaus.jackson.JsonParser读取,通过org.codehaus.jackson.JsonGenerator写入。 2) Tree Model 通过基于内存的树形结构来描述json数据,和 XML DOM类似。通过org.codehaus.jackson.map.ObjectMapper构建树,树由JsonNode节点组成。 3) Data Binding 基于属性访问或注解的方式将json和POJO对象互相转换, 受JAXB基于注解的处理方式启发。通过org.codehaus.jackson.map.ObjectMapper读写json数据。它包含两种类型: 3.1 Simple Data Binding 用于json和Java Maps, Lists, Strings, Numbers, Booleans and nulls的相互转换。 3.2 Full Data Binding 用于json和Java Bean的相互转换。 下面从使用的角度上比较三种处理方式: Streaming API 执行效率最高,读写速度最快,另外两种方式都基于它实现; Tree Model 是最灵活的; Data Binding 通常是最方便使用的;

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧