上机实验7 组件及事件处理

简介: 上机实验7 组件及事件处理

实验一 设计以下应用程序的界面

一、实验目的

掌握图形用户界面中的容器和组件的基本设计方法

二、实验内容

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、扩展功能:模仿本实验代码,再增加“小学生”级别;给程序增加测试乘法的功能。

目录
相关文章
|
人工智能 监控 算法
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
3D-Speaker是阿里巴巴通义实验室推出的多模态说话人识别开源项目,结合声学、语义和视觉信息,提供高精度的说话人识别和语种识别功能。项目包含工业级模型、训练和推理代码,以及大规模多设备、多距离、多方言的数据集,适用于多种应用场景。
4167 18
3D-Speaker:阿里通义开源的多模态说话人识别项目,支持说话人识别、语种识别、多模态识别、说话人重叠检测和日志记录
|
Linux
Linux 更新man说明手册,man中文手册
Linux 更新man说明手册,man中文手册
283 3
|
人工智能 监控 安全
浅谈API生态建设:API安全策略的6项原则
浅谈API生态建设:API安全策略的6项原则
312 0
|
NoSQL 数据可视化 Redis
redis在window环境下的安装教程
redis在window环境下的安装教程
285 0
|
Python
VScode配置python且安装pip出错详细解决办法(You are using pip version 19.2.3, however version 19.3.1 is available)
VScode配置python且安装pip出错详细解决办法(You are using pip version 19.2.3, however version 19.3.1 is available)
2700 0
|
负载均衡 算法 网络协议
网络流量监测与调度技术研究
网络流量监测与调度技术研究
|
存储 对象存储
阿里云服务器快照怎么收费?
阿里云快照服务怎么收费?阿里云服务器快照价格按量付费每小时扣费,快照费用是按照快照所占用的存储空间大小计费的,普通快照1GB价格为0.12元/GB/月,阿里云百科分享2023阿里云服务器快照收费标准:
阿里云服务器快照怎么收费?
Python3学习笔记
Python3学习笔记
|
Java 编译器
细究一下Java的动态绑定机制(非常重要)
Java重要特性:动态绑定机制 运行时绑定也叫动态绑定,它是一种调用对象方法的机制。Java调用对象方法时,一般采用运行时绑定机制。 1.当调用对象方法时,该方法会和该对象的内存地址、运行类型绑定 2.当调用对象属性时,没有动态绑定机制,那里声明,那里使用
516 0
|
SQL 安全 IDE
阿里云在家实践计划——将MySQL部署在阿里云服务器
暑期课程《python程序设计》中,课程大作业要求实现一个主要用python语言的支持GUI的应用程序。考虑到我们小组的目标,打算采用PyQt5 + PyMySQL的方式来实现。考虑到我们要将该应用程序发布给客户,为了数据的安全以及软件的适用性,我们计划将MySQL部署在服务器。

热门文章

最新文章

下一篇
开通oss服务