|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于一个大型项目,如果用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[0],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[0]},
- {"Face1",rb,newCharacter(1),a2,bT,
- Faces.faces[1]},
- {"Face2",rb,newCharacter(2),a2,bT,
- Faces.faces[2]},
- {"Face3",rb,newCharacter(3),a2,bT,
- Faces.faces[3]},
- {"Face4",rb,newCharacter(4),a2,bT,
- Faces.faces[4]},
- };
- 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[i]));
- returnmenuBar;
- }
- staticButtonGroupbgroup;
- staticpublicJMenu
- createMenu(Object[][]menuData){
- JMenumenu=newJMenu();
- menu.setText((String)menuData[0][0]);
- menu.setMnemonic(
- ((Character)menuData[0][1]).charValue());
- //Createredundantly,incasethereare
- //anyradiobuttons:
- bgroup=newButtonGroup();
- for(inti=1;i<menuData.length;i++){
- if(menuData[i][0]==null)
- menu.add(newJSeparator());
- else
- menu.add(createMenuItem(menuData[i]));
- }
- returnmenu;
- }
- staticpublicJMenuItem
- createMenuItem(Object[]data){
- JMenuItemm=null;
- MTypetype=(MType)data[1];
- if(type==mi)
- m=newJMenuItem();
- elseif(type==cb)
- m=newJCheckBoxMenuItem();
- elseif(type==rb){
- m=newJRadioButtonMenuItem();
- bgroup.add(m);
- }
- m.setText((String)data[0]);
- m.setMnemonic(
- ((Character)data[2]).charValue());
- m.addActionListener(
- (ActionListener)data[3]);
- m.setEnabled(
- ((Boolean)data[4]).booleanValue());
- if(data.length==6)
- m.setIcon((Icon)data[5]);
- 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工具的整合。 |
|