实验一 设计以下应用程序的界面
一、实验目的
掌握图形用户界面中的容器和组件的基本设计方法
二、实验内容
1、设计一个用户注册页面
1. import java.awt.FlowLayout; 2. import java.awt.GridLayout; 3. import java.awt.event.ActionEvent; 4. import java.awt.event.ActionListener; 5. import javax.swing.ButtonGroup; 6. import javax.swing.JButton; 7. import javax.swing.JCheckBox; 8. import javax.swing.JComboBox; 9. import javax.swing.JFrame; 10. import javax.swing.JLabel; 11. import javax.swing.JMenu; 12. import javax.swing.JMenuBar; 13. import javax.swing.JMenuItem; 14. import javax.swing.JOptionPane; 15. import javax.swing.JPasswordField; 16. import javax.swing.JRadioButton; 17. import javax.swing.JScrollPane; 18. import javax.swing.JTextArea; 19. import javax.swing.JTextField; 20. 21. public class MyJFrame extends JFrame{ 22. JLabel jl1,jl2,jl3,jl4,jl5,jl6,jl7; 23. JTextField jtf;//文本框 24. JPasswordField jpf1,jpf2;//密码 25. JTextArea jta; 26. JButton jb1,jb2; 27. JRadioButton jrb1,jrb2; 28. JCheckBox jcb1,jcb2,jcb3; 29. JComboBox<String> jc; 30. public MyJFrame() { 31. this.setTitle("注册"); 32. setBounds(300,300,500,600); 33. //设置窗体为流式布局 34. //setLayout(new FlowLayout()); 35. //设置窗体为网格布局 36. setLayout(new GridLayout(20,1)); 37. //空布局 38. setLayout(null); 39. init(); 40. setVisible(true); 41. setDefaultCloseOperation(EXIT_ON_CLOSE); 42. jb1.addActionListener(new ActionListener(){ 43. 44. @Override 45. public void actionPerformed(ActionEvent arg0) { 46. String info=""; 47. info="姓名:"+jtf.getText(); 48. info+="\r\n"+"密码:"+jpf1.getText(); 49. info+="\r\n"+"密码:"+jpf2.getText(); 50. info+="\r\n"+"性别:"; 51. if (jrb1.isSelected()) 52. info+=jrb1.getText(); 53. if (jrb2.isSelected()) 54. info+=jrb2.getText(); 55. info+="\r\n爱好:"; 56. if(jcb1.isSelected()) 57. info+=jcb1.getText(); 58. if(jcb2.isSelected()) 59. info+=jcb2.getText(); 60. if(jcb3.isSelected()) 61. info+=jcb3.getText(); 62. info+="\r\n学历:"+jc.getSelectedItem(); 63. info+="\r\n简历:"+jta.getText(); 64. JOptionPane.showMessageDialog(null, info); 65. } 66. 67. }); 68. jb2.addActionListener(new ActionListener() { 69. 70. @Override 71. public void actionPerformed(ActionEvent e) { 72. // System.exit(0); 73. //获取事件源对象 74. JButton jb=(JButton)e.getSource(); 75. jtf.setText(jb.getText()); 76. } 77. }); 78. } 79. //注册用的组件初始化 80. public void init() { 81. // TODO Auto-generated method stub 82. jl1=new JLabel("用户名:"); 83. jl2=new JLabel("密码:"); 84. jl7=new JLabel("再次密码:"); 85. jl3=new JLabel("简历:"); 86. jl4=new JLabel("性别:"); 87. jtf=new JTextField(10); 88. jpf1=new JPasswordField(10); 89. jpf2=new JPasswordField(10); 90. jta=new JTextArea(4,20); 91. jb1=new JButton("注册"); 92. jb2=new JButton("取消"); 93. jl1.setBounds(100,30,180,30); 94. jtf.setBounds(200,30,180,30); 95. jl2.setBounds(100, 70, 180, 30); 96. jpf1.setBounds(200, 70, 180, 30); 97. jl7.setBounds(100, 110, 180, 30); 98. jpf2.setBounds(200, 110, 180, 30); 99. jl3.setBounds(100, 280, 100, 30); 100. jta.setBounds(100,280,400,200); 101. JScrollPane jsp=new JScrollPane(jta); 102. jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); 103. jsp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 104. jsp.setBounds(170, 280, 240, 100); 105. jb1.setBounds(100, 400, 100, 30); 106. jb2.setBounds(220, 400, 100, 30); 107. jrb1=new JRadioButton("男"); 108. jrb2=new JRadioButton("女"); 109. jl4.setBounds(100, 150, 180, 30); 110. jrb1.setBounds(200,150, 100, 30); 111. jrb2.setBounds(300,150, 100, 30); 112. ButtonGroup bg=new ButtonGroup(); 113. bg.add(jrb1); 114. bg.add(jrb2); 115. jl5=new JLabel("爱好:"); 116. jcb1=new JCheckBox("游戏"); 117. jcb2=new JCheckBox("篮球"); 118. jcb3=new JCheckBox("旅游"); 119. jl5.setBounds(100 , 240, 100, 30); 120. jcb1.setBounds(160 , 240, 100, 30); 121. jcb2.setBounds(260 , 240, 100, 30); 122. jcb3.setBounds(360 , 240, 100, 30); 123. jl6=new JLabel("学历:"); 124. jc=new JComboBox<>(); 125. jc.addItem("高中"); 126. jc.addItem("大专"); 127. jc.addItem("本科"); 128. jc.addItem("研究生"); 129. jl6.setBounds(100 , 200, 100, 30); 130. jc.setBounds(200 , 200, 100, 30); 131. add(jl1); 132. add(jtf); 133. add(jl2); 134. add(jpf1); 135. add(jl7); 136. add(jpf2); 137. add(jl3); 138. add(jsp); 139. add(jl4); 140. add(jrb1); 141. add(jrb2); 142. add(jl5); 143. add(jcb1); 144. add(jcb2); 145. add(jcb3); 146. add(jl6); 147. add(jc); 148. add(jb1); 149. add(jb2); 150. } 151. public static void main(String[] args) { 152. new MyJFrame(); 153. } 154. }
2、设计一个用户登录页面
1. import java.awt.Color; 2. import java.awt.Font; 3. import java.awt.GridLayout; 4. import java.awt.event.ActionEvent; 5. import java.awt.event.ActionListener; 6. import javax.swing.JButton; 7. import javax.swing.JFrame; 8. import javax.swing.JLabel; 9. import javax.swing.JOptionPane; 10. import javax.swing.JPasswordField; 11. import javax.swing.JTextField; 12. 13. public class Regulation extends JFrame{ 14. JLabel jl1,jl2,jl3,jl4; 15. JTextField jtf;//文本框 16. JPasswordField jpf;//密码 17. JButton jb1,jb2; 18. public Regulation() { 19. this.setTitle("登录窗口"); 20. setBounds(300,300,500,400); 21. //设置窗体为流式布局 22. setLayout(new GridLayout(20,1)); 23. //空布局 24. setLayout(null); 25. init(); 26. setVisible(true); 27. setDefaultCloseOperation(EXIT_ON_CLOSE); 28. jb1.addActionListener(new ActionListener(){ 29. public void actionPerformed(ActionEvent arg0) { 30. String info=""; 31. info="姓名:"+jtf.getText(); 32. info+="\r\n"+"密码:"+jpf.getText(); 33. JOptionPane.showMessageDialog(null, info); 34. } 35. }); 36. jb2.addActionListener(new ActionListener() { 37. public void actionPerformed(ActionEvent e) { 38. // System.exit(0); 39. //获取事件源对象 40. JButton jb=(JButton)e.getSource(); 41. jtf.setText(jb.getText()); 42. } 43. }); 44. } 45. public void init() { 46. jl1=new JLabel("企业人事管理系统"); 47. jl2=new JLabel("用户名:"); 48. jl3=new JLabel("密码:"); 49. jtf=new JTextField(10); 50. jpf=new JPasswordField(10); 51. jb1=new JButton("注册"); 52. jb2=new JButton("取消"); 53. jl1.setBounds(150,30,200,60); 54. jl2.setBounds(100, 120, 180, 30); 55. jtf.setBounds(200, 120, 180, 30); 56. jl3.setBounds(100, 180, 180, 30); 57. jpf.setBounds(200, 180, 180, 30); 58. jb1.setBounds(100, 260, 100, 30); 59. jb2.setBounds(220, 260, 100, 30); 60. Font font = new Font("楷体",Font.PLAIN,25); 61. jl1.setFont(font); 62. jl1.setForeground(Color.red); 63. add(jl1); 64. add(jl2); 65. add(jtf); 66. add(jl3); 67. add(jpf); 68. add(jb1); 69. add(jb2); 70. } 71. public static void main(String[] args) { 72. new Regulation(); 73. } 74. }
3、设计一个计算器的页面
1. import java.awt.BorderLayout; 2. import java.awt.Font; 3. import java.awt.GridLayout; 4. import java.awt.event.ActionEvent; 5. import java.awt.event.ActionListener; 6. 7. import javax.swing.JButton; 8. import javax.swing.JFrame; 9. import javax.swing.JOptionPane; 10. import javax.swing.JPanel; 11. import javax.swing.JTextField; 12. 13. public class CalcJFrame extends JFrame{ 14. JButton[] jbs; 15. JButton jb2; 16. JTextField jtf; 17. String[] cons={"1","2","3","+","4","5","6","-","7","8","9","*","0",".","/","="}; 18. JPanel jp1; 19. String op1="",ops=""; 20. double num1,num2; 21. //flag=0,表示连续输入操作数,flag=1表示新的操作数开始 22. int flag=0; 23. public CalcJFrame() { 24. setTitle("计算器"); 25. setBounds(400,300,400,500); 26. setDefaultCloseOperation(EXIT_ON_CLOSE); 27. init(); 28. setVisible(true); 29. for(int i=0;i<16;i++){ 30. jbs[i].addActionListener(new ActionListener() { 31. 32. @Override 33. public void actionPerformed(ActionEvent e) { 34. JButton jb=(JButton)e.getSource(); 35. //获取用户单击的按钮上面的文本 36. char ch=jb.getText().charAt(0); 37. //判断单击的按钮属于哪个类型 38. if (ch>='0' && ch<='9'|| ch=='.'){ 39. //如果是数字 40. if (flag==1) { 41. //如果之前进行了计算,文本框中是计算结果,准备接收下一个操作数,op1清空, 42. op1=""; 43. //准备接收下一个操作数的连续输入 44. flag=0; 45. } 46. //数字连接,并显示在文本框 47. op1=op1+ch; 48. jtf.setText(op1); 49. }else if (ch=='='){//表示要对两个操作数进行运算 50. //记录刚才单击的是等号 51. flag=1; 52. //获取第二个操作数 53. num2=Double.parseDouble(op1); 54. //根据运算符进行计算 55. switch(ops){ 56. case "+": num1=num1+num2;break; 57. case "-": num1=num1-num2;break; 58. case "*": num1=num1*num2;break; 59. case "/": if (num2!=0) {num1=num1/num2;} 60. else JOptionPane.showMessageDialog(null, "出错!除数不能为零"); 61. num1=0.0;break; 62. } 63. //运算符清空 64. ops=""; 65. //将结果放在op1中 66. op1=num1+""; 67. //结果显示在文本框 68. jtf.setText(op1); 69. 70. }else{//单击了运算符,表示第二个操作数录入结束 71. if (ops!=""){//如果连续运算 72. //记录要进行计算, 73. flag=1; 74. 75. //将文本框中的内容保存在num2中 76. num2=Double.parseDouble(jtf.getText()); 77. //根据运算符计算结果 78. switch(ops){ 79. case "+": num1=num1+num2;break; 80. case "-": num1=num1-num2;break; 81. case "*": num1=num1*num2;break; 82. // case "/": if (num2!=0) num1=num1/num2;break; 83. } 84. //获取运算符到ops中 85. ops=ch+""; 86. //将计算结果放在op1中 87. op1=num1+""; 88. //将结果显示在文本框 89. jtf.setText(op1); 90. }else{//独立的单个运算,只需要记录运算符和第一个操作数 91. ops=ch+""; 92. num1=Double.parseDouble(op1); 93. //保存完第一个操作数后,清空op1内容,准备存储第二个操作数。 94. op1=""; 95. } 96. } 97. } 98. }); 99. jb2.addActionListener(new ActionListener() { 100. 101. @Override 102. public void actionPerformed(ActionEvent e) { 103. num1=0; 104. op1=""; 105. jtf.setText(""); 106. jtf.requestFocus(); 107. } 108. }); 109. } 110. } 111. public void init() { 112. jtf=new JTextField(); 113. jtf.setFont(new Font("宋体", 0, 30)); 114. jtf.setHorizontalAlignment(jtf.RIGHT); 115. jtf.setText(""); 116. add(jtf,BorderLayout.NORTH); 117. jp1=new JPanel(); 118. GridLayout gridLayout = new GridLayout(4,4); 119. gridLayout.setHgap(8); 120. gridLayout.setVgap(8); 121. jp1.setLayout(gridLayout); 122. jbs=new JButton[16]; 123. for(int i=0;i<16;i++){ 124. jbs[i]=new JButton(); 125. jbs[i].setText(cons[i]); 126. jbs[i].setFont(new Font("宋体",0,30)); 127. jp1.add(jbs[i]); 128. } 129. add(jp1); 130. jb2=new JButton("清空"); 131. jb2.setFont(new Font("宋体", 0, 30)); 132. add(jb2,BorderLayout.SOUTH); 133. } 134. public static void main(String[] args) { 135. new CalcJFrame(); 136. } 137. }
实验二 登录设计
一、实验目的
掌握ActionEvent动作事件实现界面的运行
二、实验内容
1、登录窗体类:NullLayout_Example
1. import java.awt.Color; 2. import java.awt.Font; 3. import java.awt.GridLayout; 4. import java.awt.event.ActionEvent; 5. import java.awt.event.ActionListener; 6. import javax.swing.JButton; 7. import javax.swing.JFrame; 8. import javax.swing.JLabel; 9. import javax.swing.JOptionPane; 10. import javax.swing.JPasswordField; 11. import javax.swing.JTextField; 12. 13. public class Regulation extends JFrame{ 14. JLabel jl1,jl2,jl3,jl4; 15. JTextField jtf;//文本框 16. JPasswordField jpf;//密码 17. JButton jb1,jb2; 18. public Regulation() { 19. this.setTitle("登录窗口"); 20. setBounds(300,300,500,400); 21. //设置窗体为流式布局 22. setLayout(new GridLayout(20,1)); 23. //空布局 24. setLayout(null); 25. init(); 26. setVisible(true); 27. setDefaultCloseOperation(EXIT_ON_CLOSE); 28. jb1.addActionListener(new ActionListener(){ 29. public void actionPerformed(ActionEvent arg0) { 30. String info=""; 31. info="姓名:"+jtf.getText(); 32. info+="\r\n"+"密码:"+jpf.getText(); 33. JOptionPane.showMessageDialog(null, info); 34. } 35. }); 36. jb2.addActionListener(new ActionListener() { 37. public void actionPerformed(ActionEvent e) { 38. // System.exit(0); 39. //获取事件源对象 40. JButton jb=(JButton)e.getSource(); 41. jtf.setText(jb.getText()); 42. } 43. }); 44. } 45. public void init() { 46. jl1=new JLabel("企业人事管理系统"); 47. jl2=new JLabel("用户名:"); 48. jl3=new JLabel("密码:"); 49. jtf=new JTextField(10); 50. jpf=new JPasswordField(10); 51. jb1=new JButton("注册"); 52. jb2=new JButton("取消"); 53. jl1.setBounds(150,30,200,60); 54. jl2.setBounds(100, 120, 180, 30); 55. jtf.setBounds(200, 120, 180, 30); 56. jl3.setBounds(100, 180, 180, 30); 57. jpf.setBounds(200, 180, 180, 30); 58. jb1.setBounds(100, 260, 100, 30); 59. jb2.setBounds(220, 260, 100, 30); 60. Font font = new Font("楷体",Font.PLAIN,25); 61. jl1.setFont(font); 62. jl1.setForeground(Color.red); 63. add(jl1); 64. add(jl2); 65. add(jtf); 66. add(jl3); 67. add(jpf); 68. add(jb1); 69. add(jb2); 70. } 71. public static void main(String[] args) { 72. new Regulation(); 73. } 74. }
2、用户名密码不正确,给出如下提示
3、用户名为admin密码为123456,则给出如下提示,并进入下个窗体
1. import java.awt.Color; 2. import java.awt.Font; 3. import java.awt.GridLayout; 4. import java.awt.event.ActionEvent; 5. import java.awt.event.ActionListener; 6. 7. import javax.swing.JButton; 8. import javax.swing.JFrame; 9. import javax.swing.JLabel; 10. import javax.swing.JOptionPane; 11. import javax.swing.JPasswordField; 12. import javax.swing.JTextField; 13. 14. public class Login extends JFrame{ 15. JLabel jl1,jl2,jl3,jl4; 16. JTextField jtf;//文本框 17. JPasswordField jpf;//密码 18. JButton jb1,jb2; 19. public Login() { 20. this.setTitle("登录窗口"); 21. setBounds(300,300,500,400); 22. //设置窗体为流式布局 23. setLayout(new GridLayout(20,1)); 24. //空布局 25. setLayout(null); 26. init(); 27. setVisible(true); 28. setDefaultCloseOperation(EXIT_ON_CLOSE); 29. jb1.addActionListener(new ActionListener(){ 30. public void actionPerformed(ActionEvent e) { 31. if(jtf.getText().trim().equals("admin")&& 32. new String(jpf.getPassword()).trim().equals("123456")) 33. {JOptionPane.showMessageDialog(null, "欢迎进入本系统!"); 34. new MyFrameArea();} 35. else if(jtf.getText().trim().length()==0|| 36. new String(jpf.getPassword()).trim().length()==0) 37. {JOptionPane.showMessageDialog(null, "用户名或密码不能为空!");} 38. else {JOptionPane.showMessageDialog(null, "用户名或密码错误!");} 39. } 40. }); 41. jb2.addActionListener(new ActionListener() { 42. public void actionPerformed(ActionEvent e) { 43. // System.exit(0); 44. //获取事件源对象 45. JButton jb=(JButton)e.getSource(); 46. jtf.setText(jb.getText()); 47. } 48. }); 49. 50. } 51. public void init() { 52. jl1=new JLabel("企业人事管理系统"); 53. jl2=new JLabel("用户名:"); 54. jl3=new JLabel("密码:"); 55. jtf=new JTextField(10); 56. jpf=new JPasswordField(10); 57. jb1=new JButton("登录"); 58. jb2=new JButton("取消"); 59. jl1.setBounds(150,30,200,60); 60. jl2.setBounds(100, 120, 180, 30); 61. jtf.setBounds(200, 120, 180, 30); 62. jl3.setBounds(100, 180, 180, 30); 63. jpf.setBounds(200, 180, 180, 30); 64. jb1.setBounds(100, 260, 100, 30); 65. jb2.setBounds(220, 260, 100, 30); 66. Font font = new Font("楷体",Font.PLAIN,25); 67. jl1.setFont(font); 68. jl1.setForeground(Color.red); 69. add(jl1); 70. add(jl2); 71. add(jtf); 72. add(jl3); 73. add(jpf); 74. add(jb1); 75. add(jb2); 76. } 77. public static void main(String[] args) { 78. new Login(); 79. } 80. }
4、单击确定,显示如下
计算面积窗体类:MyFrame
在窗体中输入半径值,单击计算显示面积
1. import java.awt.Color; 2. import java.awt.Font; 3. import java.awt.GridLayout; 4. import java.awt.event.ActionEvent; 5. import java.awt.event.ActionListener; 6. 7. import javax.swing.JButton; 8. import javax.swing.JFrame; 9. import javax.swing.JLabel; 10. import javax.swing.JOptionPane; 11. import javax.swing.JTextField; 12. 13. public class MyFrameArea extends JFrame{ 14. JLabel jl1,jl2; 15. JTextField jtf;//文本框 16. JButton jb; 17. double PI=3.14; 18. double r,S; 19. public MyFrameArea() { 20. this.setTitle("计算面积"); 21. setBounds(300,300,500,400); 22. //设置窗体为流式布局 23. setLayout(new GridLayout(20,1)); 24. //空布局 25. setLayout(null); 26. init(); 27. setVisible(true); 28. setDefaultCloseOperation(EXIT_ON_CLOSE); 29. jb.addActionListener(new ActionListener(){ 30. public void actionPerformed(ActionEvent e) { 31. String info=""; 32. info=jtf.getText(); 33. r=Double.parseDouble(info); 34. S=PI*r*r; 35. JOptionPane.showMessageDialog(null, S); 36. }});} 37. public void init() { 38. jl1=new JLabel("请输入半径:"); 39. jtf=new JTextField(); 40. jb=new JButton("计算"); 41. jl1.setBounds(20,34,200,60); 42. jtf.setBounds(180, 50, 150, 30); 43. jb.setBounds(350, 49, 100, 30); 44. Font font = new Font("楷体",Font.PLAIN,25); 45. jl1.setFont(font); 46. jl1.setForeground(Color.black); 47. add(jl1); 48. add(jtf); 49. add(jb); 50. } 51. public static void main(String[] args) { 52. new MyFrameArea(); 53. } 54. }
三、实验指导
1、涉及到两个窗体类,登录窗体、计算面积窗体,一个测试类
2、为了完成界面的正常运行,需要对相应的组件添加监视器,并实现接口中的方法
例如:
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//判断用户输入是否正确的代码
}
});
3、显示消息的对话框的方法
JOptionPane.showMessageDialog(null, "欢迎进入本系统");
JOptionPane类不仅可以弹出消息对话框,还可以弹出输入对话框(参看API)
实验三 算术测试
一、实验目的
掌握处理ActionEvent事件的方法
二、实验内容
编写一个算术测试小软件,用来训练小学生的算术能力。程序有3个类组成,其中Teacher类的对象充当监视器,负责给出算术题目,并判断回答者的答案是否正确;ComputerFrame类的对象负责为算术题目提供视图,比如用户可以通过ComputerFrame对象提供的GUI界面看到题目,并通过改GUI界面给出题目的答案;MailClass是软件的主类。
三、程序代码
MainClass.java
1. public class MainClass { 2. public static void main(String args[]) { 3. ComputerFrame frame; 4. frame=new ComputerFrame(); 5. frame.setTitle("算术测试"); 6. frame.setBounds(100,100,650,180); 7. } 8. }
ComputerFrame.java
1. import java.awt.FlowLayout; 2. import java.awt.Font; 3. import java.awt.event.ActionEvent; 4. import java.awt.event.ActionListener; 5. 6. import javax.swing.JButton; 7. import javax.swing.JFrame; 8. import javax.swing.JLabel; 9. import javax.swing.JMenu; 10. import javax.swing.JMenuBar; 11. import javax.swing.JMenuItem; 12. import javax.swing.JTextField; 13. public class ComputerFrame extends JFrame { 14. JMenuBar menubar; 15. JMenu choiceGrade; //选择级别的菜单 16. JMenuItem grade1,grade2; 17. JTextField textOne,textTwo,textResult; 18. JButton getProblem,giveAnwser; 19. JLabel operatorLabel,message; 20. Teacher teacherZhang; 21. ComputerFrame() { 22. teacherZhang=new Teacher(); 23. teacherZhang.setMaxInteger(20); 24. setLayout(new FlowLayout()); 25. menubar = new JMenuBar(); 26. choiceGrade = new JMenu("选择级别"); 27. grade1 = new JMenuItem("幼儿级别"); 28. grade2 = new JMenuItem("儿童级别"); 29. grade1.addActionListener(new ActionListener() { 30. public void actionPerformed(ActionEvent e) { 31. teacherZhang.setMaxInteger(10); 32. } 33. }); 34. grade2.addActionListener(new ActionListener() { 35. public void actionPerformed(ActionEvent e) { 36. teacherZhang.setMaxInteger(50); 37. } 38. }); 39. choiceGrade.add(grade1); 40. choiceGrade.add(grade2); 41. menubar.add(choiceGrade); 42. setJMenuBar(menubar); 43. textOne=new JTextField(5);//创建textOne,其可见字符长是5 44. textTwo=new JTextField(5); 45. textResult=new JTextField(5); 46. operatorLabel=new JLabel("+"); 47. operatorLabel.setFont(new Font("Arial",Font.BOLD,20)); 48. message=new JLabel("你还没有回答呢"); 49. getProblem=new JButton("获取题目"); 50. giveAnwser=new JButton("确认答案"); 51. add(getProblem); 52. add(textOne); 53. add(operatorLabel); 54. add(textTwo); 55. add(new JLabel("=")); 56. add(textResult); 57. add(giveAnwser); 58. add(message); 59. textResult.requestFocus(); 60. textOne.setEditable(false); 61. textTwo.setEditable(false); 62. getProblem.setActionCommand("getProblem"); 63. textResult.setActionCommand("answer"); 64. giveAnwser.setActionCommand("answer"); 65. teacherZhang.setJTextField(textOne,textTwo,textResult); 66. teacherZhang.setJLabel(operatorLabel,message); 67. getProblem.addActionListener(teacherZhang);//将teacherZhang注册为getProblem的ActionEvent事件监视器 68. giveAnwser.addActionListener(teacherZhang);//将teacherZhang注册为giveAnwser的ActionEvent事件监视器 69. textResult.addActionListener(teacherZhang);//将teacherZhang注册为textResult的ActionEvent事件监视器 70. setVisible(true); 71. validate(); 72. setDefaultCloseOperation(DISPOSE_ON_CLOSE); 73. } 74. }
Teacher.java
1. import java.util.Random; 2. import java.awt.event.*; 3. import javax.swing.*; 4. public class Teacher implements ActionListener { 5. int numberOne,numberTwo; 6. String operator=""; 7. boolean isRight; 8. Random random; //用于给出随机数 9. int maxInteger; //题目中最大的整数 10. JTextField textOne,textTwo,textResult; 11. JLabel operatorLabel,message; 12. Teacher() { 13. random = new Random(); 14. } 15. public void setMaxInteger(int n) { 16. maxInteger=n; 17. } 18. public void actionPerformed(ActionEvent e) { 19. String str = e.getActionCommand(); 20. if(str.equals("getProblem")) { 21. numberOne = random.nextInt(maxInteger)+1;//1至maxInteger之间的随机数; 22. numberTwo=random.nextInt(maxInteger)+1; 23. double d=Math.random(); // 获取(0,1)之间的随机数 24. if(d>=0.5) 25. operator="+"; 26. else 27. operator="-"; 28. textOne.setText(""+numberOne); 29. textTwo.setText(""+numberTwo); 30. operatorLabel.setText(operator); 31. message.setText("请回答"); 32. textResult.setText(null); 33. } 34. else if(str.equals("answer")) { 35. String answer=textResult.getText(); 36. try{ int result=Integer.parseInt(answer); 37. if(operator.equals("+")){ 38. if(result==numberOne+numberTwo) 39. message.setText("你回答正确"); 40. else 41. message.setText("你回答错误"); 42. } 43. else if(operator.equals("-")){ 44. if(result==numberOne-numberTwo) 45. message.setText("你回答正确"); 46. else 47. message.setText("你回答错误"); 48. } 49. } 50. catch(NumberFormatException ex) { 51. message.setText("请输入数字字符"); 52. } 53. } 54. } 55. public void setJTextField(JTextField ... t) { 56. textOne=t[0]; 57. textTwo=t[1]; 58. textResult=t[2]; 59. } 60. public void setJLabel(JLabel ...label) { 61. operatorLabel=label[0]; 62. message=label[1]; 63. } 64. }
四、实验指导
1、学习处理事件时,必须掌握事件源、监视器、处理事件的接口这3个概念。
2、JButton对象可以触发ActionEvent事件。为了能监视到此类型事件,事件源必须使用addActionListener方法获得监视器,创建监视器类必须实现接口ActionListener。
3、扩展功能:模仿本实验代码,再增加“小学生”级别;给程序增加测试乘法的功能。








