程序框架
1、利用向导生成Applet
首先创建一个工程(File->New...->Project->双击Project页中的Project图标),我们将工程名取为game,然后利用下面的步骤,调用Applet向导生成TypeTrainApplet。
1) 启动Applet向导
File->New...->Web->双击Web页中Applet的图标启动共4步的Applet向导。
2) 向导第1步,填写Applet的详细信息。
 图 4 Applet向导第1步 | ·ClassName:Applet的类名,填入TypeTrainApplet
·Package:包名,接受默认值
·Base Class:父类,有两个选项,一个是java.applet.Applet,另一个是javax.swing.JApplet。前者以AWT为基础,而后者以Swing为基础。如果客户端浏览器的JRE版本很低,且你不希望客户下载额外的插件,则需要考虑用java.applet.Applet,且不能应用高版本JDK中的特性,这里我们用javax.swing.JApplet。
·Generate header comments:在产生Applet代码时,产生类标题头的注释说明,你大可不必生成这些注释。
·Can run standalone:是否将Applet设置为可独立运行,如果勾选,JBuilder为其生成了一个main函数,这样就可以在脱离浏览器或AppletViewer的情况下,像一般可运行类一样运行这个Applet中的功能,我们不勾选它。
·Generate standard methods:是否生成Applet的标准函数,大家都知道Applet通过4个函数管理着Applet的生命周期,它们分别是init()、start()、stop()、destroy()。如果不勾选这个选项,向导只会生成init()方法,而其他3个方法不会生成。在我们的例子中,需要用到其他3个方法,所以需要勾选。
按Next到下一步。
3) 定义Applet的参数
Applet的参数是指通过网页中<applet>标签的<param>指定的参数值,这些值可以在Applet类中引用到。这样就允许在不改变Applet程序的情况下,仅通过网页中<applet>属性值的更改控制Applet的表现。我们在这一步中为Applet设置4个控制变量参数,如下图所示:
 图 5 为Applet设置参数 | 这一步的设置,不但为网页生成了参数声明,还为Applet程序生成了从网页获取参数值的方法,在Applet初始化时,即将网页中的参数值赋给Applet的成员变量。
点击Add Parameter新增一行,声明一个新的参数,其中Name*为网页中参数的名字,而Variable*为Applet类成员变量名,通过Type*栏设置成员变量的数据类型。你还可以为参数在Default栏中指定一个默认的值,在Desc中给出描述说明信息,其中带*的栏是必填的栏。
点击Next到下一步。
4) 设置包含这个Applet的网页
在这一步里,我们指定包含这个Applet网页的<applet>标签的一些属性,如下图所示:
 图 6 设置引用Applet的网页 | JBuilder会生成一个引用Applet的HTML网页,网页名字和Applet的类名相同,网页通过<applet>标签引用Applet,网页的标题及<applet>属性值在这一步中设置。
我们除将Height从默认的300调整为400,其他的都保持不变。按Next到最后一步。
5) 创建运行配置项
在这一步里JBuilder允许你决定是否为Applet生成一个运行配置项,运行配置项是允许你配置运行时的有关属性,如运行的入口类,在运行时是否重新编译等,你也可以通过Project->Project Properties...->Run来维护运行配置项。
 图 7 设置Applet运行配置信息 | 点击Finish完成Applet的创建向导。此时JBuilder为这个Applet生成了两个文件,一个是TypeTrainApplet.java程序文件,而另一个是引用这个Applet的TypeTrainApplet.html网页。我们来看这两个文件的主要结构。
代码清单 1 TypeTrainApplet.html 引用Applet的网页表
1. <html> 2. <head> 3. <meta http-equiv="Content-Type" content="text/html; charset=GBK"> 4. <title> 5. HTML Test Page 6. </title> 7. </head> 8. <body> 9. game.TypeTrainApplet will appear below in a Java enabled browser.<br> 10. <applet 11. codebase = "." 12. code = "game.TypeTrainApplet.class" 13. name = "TestApplet" 14. width = "400" 15. height = "400" 16. hspace = "0" 17. vspace = "0" 18. align = "middle" 19. > 20. <param name = "stepLen" value = "2"> 21. <param name = "stepInterval" value = "50"> 22. <param name = "columnCount" value = "10"> 23. <param name = "generateInterval" value = "500"> 24. </applet> 25. </body> 26. </html> | 在向导第2步所设置的Applet参数悉数在网页中定义(第20~23行),在向导第3步中设置的Applet属性反映在第11~18行中。
Applet类的TypeTrainApplet.java文件代码如下所示:
代码清单 2 TypeTrainApplet.java
1. package game; 2. 3. import java.awt.*; 4. import java.awt.event.*; 5. import java.applet.*; 6. import javax.swing.*; 7. 8. public class TypeTrainApplet1 extends JApplet { 9. boolean isStandalone = false; 10. BorderLayout borderLayout1 = new BorderLayout(); 11. int stepLen; 12. int stepInterval; 13. int columnCount; 14. int generateInterval; 15. 16. //Get a parameter value 17. public String getParameter(String key, String def) { 18. return isStandalone ? System.getProperty(key, def) : 19. (getParameter(key) != null ? getParameter(key) : def); 20. } 21. 22. //Construct the applet 23. public TypeTrainApplet1() { 24. } 25. 26. //Initialize the applet 27. public void init() { 28. try { 29. stepLen = Integer.parseInt(this.getParameter("stepLen", "2")); 30. } catch (Exception e) { 31. e.printStackTrace(); 32. } 33. try { 34. stepInterval = Integer.parseInt(this.getParameter("stepInterval", 35. "50")); 36. } catch (Exception e) { 37. e.printStackTrace(); 38. } 39. try { 40. columnCount = Integer.parseInt(this.getParameter("columnCount", 41. "10")); 42. } catch (Exception e) { 43. e.printStackTrace(); 44. } 45. try { 46. generateInterval = Integer.parseInt(this.getParameter( 47. "generateInterval", "500")); 48. } catch (Exception e) { 49. e.printStackTrace(); 50. } 51. try { 52. jbInit(); 53. } catch (Exception e) { 54. e.printStackTrace(); 55. } 56. } 57. 58. //Component initialization 59. private void jbInit() throws Exception { 60. this.setSize(new Dimension(400, 300)); 61. this.getContentPane().setLayout(borderLayout1); 62. } 63. 64. //Get Applet information 65. public String getAppletInfo() { 66. return "Applet Information"; 67. } 68. 69. //Get parameter info 70. public String[][] getParameterInfo() { 71. java.lang.String[][] pinfo = { { 72. "stepLen", "int", "每次下落的步长"}, { 73. "stepInterval", "int", "每移动一个像素的间隔时间,以毫秒为单位"}, { 74. "columnCount", "int", 分成多少列"}, { 75. "generateInterval", "int", 分成多少列"}, 76. }; 77. return pinfo; 78. } 79. 80. //static initializer for setting look & feel 81. static { 82. try { 83. //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 84. } catch (Exception e) { 85. } 86. } 87. } | 其中第11~14行定义了对应向导第2步所定义的参数变量,第70~78行获取参数的注释信息。在Applet通过init()初始化,在init()中调用方法将网页中参数的值赋给Applet类的成员变量,以初始化变量的值。在第59~62行设定了Applet的大小,其值应该和网页中<applet>的width和height属性值一致。
2、设计Applet界面
打开TypeTrainApplet.java,切换到Design视图页面中,设计如下的Applet界面
 图 8 Applet界面设计 | 承继JApplet的Applet其默认的布局管理器是BorderLayout,首先在其东区(BorderLayout.EAST)放置一个infoPnl的JPanel组件,将infoPnl的布局管理器设置为GridLayout,9行1列,即在jbInit()方法中通过infoPnl.setLayout(new GridLayout(9, 1));设置。再在infoPnl上依次放置9个组件,这些组件的类型和用途分别说明如表所示:
表 2 组件说明
| 组件名 |
组件类型 |
用途 |
| jButton1 |
JButton |
开始/暂停按钮 |
| jButton2 |
JButton |
结束按钮 |
| jButton3 |
JButton |
保存按钮 |
| totalLbl_1 |
JLabel |
总数标签 |
| totalLbl_2 |
JLabel |
总数值显示标签 |
| rightLbl_1 |
JLabel |
正确数标签 |
| rightLbl_2 |
JLabel |
正确数值显示标签 |
| errorLbl_1 |
JLabel |
错误数标签 |
| errorLbl_2 |
JLabel |
错误数值显示标签 | 你只要从设计器窗口左边的组件库中用鼠标将组件拖到设计窗口的相应位置,并放开鼠标就可以了相应生成用户界面的代码了。
由于画布组件没有java.awt.Canvas并没有列在JBuilder的组件面板中,你可以直接通过编码的方式把画布组件放到Applet的中区(BorderLayout.CENTER),了可以点击JBuilder可视化设计器的Bean选择器图标 (位于组件库的上方),在弹出的Bean Chooser对话框中选择java.awt.Canvas,如下图所示:
 图 9 通过Bean选择器选择Canvas组件 | 在Bean Chooser对话框中有一棵以包组织的类树,选择Canvas类,再点击OK按钮,在可视化设计器的Bean选择器的下拉菜单中将出现java.awt.Canvas的类,如下图所示:
 图 10 Bean选择器中的Canvas组件类 | 点击下拉菜单中的java.awt.Canvas,鼠标移到Applet设计界面的中心点击一下,一个画布组件就被添加到Applet的中区去了。在组件树中选中这个Applet中,将其命名为canvas,并确认其Constaints属性是CENTER(即位于中区)。
3、游戏的统计数据
游戏包括3个统计数据,即已产生字母的总数,被正确击中的字母数及未被击中的字母数。需要有3个变量来保存这些统计数据,同时还需要一个方法,将数据写到Applet界面的统计标签组件中去。当用户点击开始按钮时调用resetGame()方法将这些统计数据归0。
我们在TypeTrainApplet中添加以下粗体的代码。
代码清单 3 统计数据
1. … 2. public class TypeTrainApplet extends JApplet 3. { 4. … 5. volatile int totalCount = 0;//总数计数器 6. volatile int rightCount = 0;//正确数计数器 7. volatile int errorCount = 0;//错误数计数器 8. public TypeTrainApplet() 9. {} 10. … 11. //将统计结果画到界面上 12. private void drawResult() 13. { 14. totalLbl_2.setText("" + totalCount); 15. rightLbl_2.setText("" + rightCount); 16. errorLbl_2.setText("" + errorCount); 17. } 18. //重置现场 19. private void resetGame() 20. { 21. totalCount = 0; 22. rightCount = 0; 23. errorCount = 0; 24. drawResult(); 25. } 26. … 27. } | drawResult()方法以下两种情况下都应被调用:
·击中一个字母。
·一个字母下落到底端。
而resetGame()方法在点击开始按钮后调用,将3个统计变量归零,以便重新开始统计。
|
|