发布一篇java swing菜单例子
对于一个大型项目,如果用java来作,可能需要9个月,并且可能需要翻阅10本以上的书,但如果用ruby来作,3个月,3本书就足够了,而.net网页编程也不过3,4本书足以,这就是区别。菜单在Swing中做了主要的改善而且加倍的天真——比方,我们能够在几近程序中任何中央利用他们,包含在面板和程序片中。语法同它们在老的AWT中是一样的,而且如许使呈现在老AWT的在新的Swing也呈现了:我们必需为我们的菜单困难地编写代码,而且有一些不再作为资本撑持菜单(别的事务中的一些将使它们更容易转换成别的的编程言语)。别的,菜单代码相称的冗杂,偶然另有一些凌乱。上面的办法是安排一切的关于每一个菜单的信息到对象的二维数组里(这类办法能够安排我们想处置的任何事物到数组里),这类办法在办理这个成绩方面抢先了一步。这个二维数组被菜单所创立,因而它起首暗示出菜单名,并在残剩的列中暗示菜单项和它们的特征。我们会注重到数组列不用坚持分歧——只需我们的代码晓得将产生的统统事务,每列都能够完整分歧。
//:Menus.java
//Amenu-buildingsystem;alsodemonstrates
//iconsinlabelsandmenuitems.
packagec13.swing;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassMenusextendsJPanel{
staticfinalBoolean
bT=newBoolean(true),
bF=newBoolean(false);
//Dummyclasstocreatetypeidentifiers:
staticclassMType{MType(inti){}};
staticfinalMType
mi=newMType(1),//Normalmenuitem
cb=newMType(2),//Checkboxmenuitem
rb=newMType(3);//Radiobuttonmenuitem
JTextFieldt=newJTextField(10);
JLabell=newJLabel("IconSelected",
Faces.faces,JLabel.CENTER);
ActionListenera1=newActionListener(){
publicvoidactionPerformed(ActionEvente){
t.setText(
((JMenuItem)e.getSource()).getText());
}
};
ActionListenera2=newActionListener(){
publicvoidactionPerformed(ActionEvente){
JMenuItemmi=(JMenuItem)e.getSource();
l.setText(mi.getText());
l.setIcon(mi.getIcon());
}
};
//Storemenudataas"resources":
publicObject[][]fileMenu={
//Menunameandaccelerator:
{"File",newCharacter(F)},
//Nametypeaccellistenerenabled
{"New",mi,newCharacter(N),a1,bT},
{"Open",mi,newCharacter(O),a1,bT},
{"Save",mi,newCharacter(S),a1,bF},
{"SaveAs",mi,newCharacter(A),a1,bF},
{null},//Separator
{"Exit",mi,newCharacter(x),a1,bT},
};
publicObject[][]editMenu={
//Menuname:
{"Edit",newCharacter(E)},
//Nametypeaccellistenerenabled
{"Cut",mi,newCharacter(t),a1,bT},
{"Copy",mi,newCharacter(C),a1,bT},
{"Paste",mi,newCharacter(P),a1,bT},
{null},//Separator
{"SelectAll",mi,newCharacter(l),a1,bT},
};
publicObject[][]helpMenu={
//Menuname:
{"Help",newCharacter(H)},
//Nametypeaccellistenerenabled
{"Index",mi,newCharacter(I),a1,bT},
{"Usinghelp",mi,newCharacter(U),a1,bT},
{null},//Separator
{"About",mi,newCharacter(t),a1,bT},
};
publicObject[][]optionMenu={
//Menuname:
{"Options",newCharacter(O)},
//Nametypeaccellistenerenabled
{"Option1",cb,newCharacter(1),a1,bT},
{"Option2",cb,newCharacter(2),a1,bT},
};
publicObject[][]faceMenu={
//Menuname:
{"Faces",newCharacter(a)},
//Optinallastelementisicon
{"Face0",rb,newCharacter(0),a2,bT,
Faces.faces},
{"Face1",rb,newCharacter(1),a2,bT,
Faces.faces},
{"Face2",rb,newCharacter(2),a2,bT,
Faces.faces},
{"Face3",rb,newCharacter(3),a2,bT,
Faces.faces},
{"Face4",rb,newCharacter(4),a2,bT,
Faces.faces},
};
publicObject[]menuBar={
fileMenu,editMenu,faceMenu,
optionMenu,helpMenu,
};
staticpublicJMenuBar
createMenuBar(Object[]menuBarData){
JMenuBarmenuBar=newJMenuBar();
for(inti=0;i<menuBarData.length;i++)
menuBar.add(
createMenu((Object[][])menuBarData));
returnmenuBar;
}
staticButtonGroupbgroup;
staticpublicJMenu
createMenu(Object[][]menuData){
JMenumenu=newJMenu();
menu.setText((String)menuData);
menu.setMnemonic(
((Character)menuData).charValue());
//Createredundantly,incasethereare
//anyradiobuttons:
bgroup=newButtonGroup();
for(inti=1;i<menuData.length;i++){
if(menuData==null)
menu.add(newJSeparator());
else
menu.add(createMenuItem(menuData));
}
returnmenu;
}
staticpublicJMenuItem
createMenuItem(Object[]data){
JMenuItemm=null;
MTypetype=(MType)data;
if(type==mi)
m=newJMenuItem();
elseif(type==cb)
m=newJCheckBoxMenuItem();
elseif(type==rb){
m=newJRadioButtonMenuItem();
bgroup.add(m);
}
m.setText((String)data);
m.setMnemonic(
((Character)data).charValue());
m.addActionListener(
(ActionListener)data);
m.setEnabled(
((Boolean)data).booleanValue());
if(data.length==6)
m.setIcon((Icon)data);
returnm;
}
Menus(){
setLayout(newBorderLayout());
add(createMenuBar(menuBar),
BorderLayout.NORTH);
JPanelp=newJPanel();
p.setLayout(newBorderLayout());
p.add(t,BorderLayout.NORTH);
p.add(l,BorderLayout.CENTER);
add(p,BorderLayout.CENTER);
}
publicstaticvoidmain(Stringargs[]){
Show.inFrame(newMenus(),300,200);
}
}///:~这个程序的目标是同意程序计划者复杂地创立表格来形貌每一个菜单,而不是输出代码行来创建菜单。每一个菜单都发生一个菜单,表格中的第一列包括菜单名和键盘快速键。其他的列包括每一个菜单项的数据:字符串存在在菜单项中的地位,菜单的范例,它的快速键,当菜单项被选中时被激活的举措吸收器及菜单是不是被激活等信息。假如列入手下手处是空的,它将被作为一个分开符来处置。
为了防备华侈和冗杂的多个Boolean创立的对象和范例标记,以下的这些在类入手下手时就作为staticfinal被创立:bT和bF形貌Booleans和哑类MType的分歧对象形貌尺度的菜单项(mi),复选框菜单项(cb),和单选钮菜单项(rb)。请记着一组Object能够具有单一的Object句柄,而且不再是本来的值。
这个程序例子一样展现了JLables和JMenuItems(和它们的衍惹事物)怎样处置图标的。一个图标经过它的构建器置放进JLable中并当对应的菜单项被选中时被改动。
菜单条数组把持处置一切在文件菜单清单中列出的,我们想显现在菜单条上的文件菜单。我们经由过程这个数组往利用createMenuBar(),将数组分类成独自的菜双数据数组,再经由过程每一个独自的数组往创立菜单。这类办法顺次利用菜双数据的每行并以该数据创立JMenu,然后为菜双数据中剩下的每行挪用createMenuItem()办法。最初,createMenuItem()办法剖析菜双数据的每行而且判别菜单范例和它的属性,再得当地创立菜单项。终究,像我们在菜单构建器中看到的一样,从暗示createMenuBar(menuBar)的表格中创立菜单,而一切的事物都是接纳递回办法处置的。
这个程序不克不及创建串连的菜单,但我们具有充足的常识,假如我们必要的话,随时都能增添多级菜单出来。
最后就是我对java的几点希望:首先是IDE工具,有人说java已经很好了,有jbuilder,eclipse,net网页编程Beans等等,但是我认为如果java想超越.net网页编程,那么他首先要解决的就是IDE工具的整合。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 Java是一种计算机编程语言,拥有跨平台、面向对java 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。 另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。 象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。 自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢? 是一种将安全性(Security)列为第一优先考虑的语言 在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。 科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
页:
[1]