java动态菜单,大家看看可否优化

liaomingxue 2003-11-24 06:47:22
一般的,应用程序是需要记录用于最近打开的文件的.我在我的窗口类中写了一个方法
来实现这点,各位看看有没有什么问题?(功能是正确的,但不知有没有效率问题,内存泄漏等,或者有没有更好的办法)(这个方法在jbInit()中要调用,用于菜单初始化,然后每当用户成功打开一个文件也要调用):
public class MainFrame ....................
{
...............................
public void loadFileMenu()
{
//get the last 4 files users opened.The names of these files
//are recorded in app.history which will be serialized after
//the program exit.
java.util.Vector v=app.history.getRecentFiles();

if(v!=null && v.size()>0)
{
int i;

// fileMenu only contain recent files
this.fileMenu.removeAll();

for(i=0;i<v.size();i++)
{
JMenuItem item=new JMenuItem(""+(i+1)+": "+v.get(i));
this.fileMenu.add(item);
item.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String name=((JMenuItem)e.getSource()).getText();
name=name.substring(3);
File f=new File(name);
if(f.exists() && name.toLowerCase().endsWith(".wav"))
{
// communication with other objects
wd.notifyAllObservers(FILE_OPENED,f);
app.history.lastOpenDir=f.getPath();

// record opened file path in History class
// if successfully,then update filemenu
if(app.history.addRencentFile(f.getAbsolutePath)))
loadFileMenu();
}
}
});
}
}
v=null;
}
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liaomingxue 2003-11-25
  • 打赏
  • 举报
回复
说得不错.我再找些别的资料详细了解.我感觉自己的理论不是很扎实.
总有些疑惑.
结帐!
但是考虑言出必行,给你40分,其余的给别人.
感谢!
noratong 2003-11-25
  • 打赏
  • 举报
回复
哦,你说的这个类,至于它的资源消耗情况我也不是很清楚,因为我对一般的类的资源消耗情况都不是很清楚.不过我个人觉得内部类应该不会比一般的类消耗更多的资源,因为它毕竟也是个类,而且我记得原来老师说过,类并不占很多内存空间,因为它只是个声明,而真正占内存空间的是类生成的实例.不知道我这样说对不对.我想内部类也部会特殊.就我个人认为内部类和外部类没多大区别,只不过方便一个类访问另一个类的内部成员而已.而且内部类一般只用来处理事件监听器,当然也可以用作别的方面.

不过我要提醒你的是你所说的这种形式的类:item.addActionListener(new ActionListener(),应该不叫内部类才对,应该叫匿名类.真正的内部类是有完整的类的定义的.更一般类没什么区别,只不过写在一个类的内部而已.而匿名类只是一种类的简写形式,一般只用于只带有一个方法的类,而且你也应该注意到匿名类不方便自己写构造函数,也就相当于没有构造函数,有也是系统提供的缺省的构造函数,很不方便.

好,我就说这么多吧,纯属个人看法,如有错误,敬请原谅.
liaomingxue 2003-11-24
  • 打赏
  • 举报
回复
内部类就是: item.addActionListener(new ActionListener()
中涉及的那个类
wxh512 2003-11-24
  • 打赏
  • 举报
回复
同意楼上的
noratong 2003-11-24
  • 打赏
  • 举报
回复
那几个最近菜单项必须保存下来,这是毫无疑问的.因为每次运行程序都要根据这些菜单项来建立菜单.

至于你考虑的情况,我觉得应该不会有很大问题,因为我们并没有改变菜单项的数量.而只是简单的替换.内存不会变大.

那个内部类的资源情况我也不是很清楚,我不知道你说的是那个内部类???Sorry.
liaomingxue 2003-11-24
  • 打赏
  • 举报
回复
To noratong(诺拉)
1.根据JMenu.getItems()等方法,确实可以判断当前文件菜单的子菜单的
多少,然后顺序地将各个子菜单赋值,或者删除掉最后一个子菜单,插入
一个新子菜单到最前面.
2.但是这样的话,需要在应用程序关闭的时候,将菜单信息写入History.
应用程序启动时,从History中读出前次的"最近文件".
3.这样可以显著减少对History的操作.(只需要在程序的开始和结束
各访问一次)
不知是不是这个意思?还有一些疑问是:
不管怎样,在用户打开一个文件后,总是要new一个子菜单,在我的程序中,这
会造成内存问题吗?你知道用户打开文件的操作可能是频繁的.可否给我讲
讲我的程序函数中的那个内部类的资源占用和释放情况.inner类可否指点
一番?
noratong 2003-11-24
  • 打赏
  • 举报
回复
我帮你找了,JMenu有个insert()方法,里面传入你要插入的位置的序号就可以了,也有remove()方法,传入序号和名字都可以.这样的话,用我说的第二种方法要简单多了.

你说呢????
noratong 2003-11-24
  • 打赏
  • 举报
回复
你为什么不像有些程序那样,固定最近打开文件的记录数,比如只保存5个最近打开的文件.那就不用根据你的app.history.getRecentFiles()大小来确定最近打开的文件数,也就减少了你的菜单项了.我看你好像是根据菜单项的文本来打开文件的.你可以再每次打开文件的操作你把最近菜单项作个递推的循环,比如把菜单1赋给菜单2,菜单2赋给菜单3........,一直递推到菜单项的的最后一项,或者更简单的方法就是删除菜单项的最后一项,载第一项菜单前添加你打开的这个文件的菜单(我说的这些菜单项都是针对最近文件菜单下的子菜单而言的).

不知道你懂我的意思没?????
kinzey34 2003-11-24
  • 打赏
  • 举报
回复
怎么才过了1个多小时你就认为大家没有意见了?多等等吧
liaomingxue 2003-11-24
  • 打赏
  • 举报
回复
既然大家没有意见,就送分了,来者有分
minghui000 2003-11-24
  • 打赏
  • 举报
回复
1

62,614

社区成员

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

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