结对编程总结
一、简介
本次博客介绍结对编程(中小学出卷系统),采用Java语言,我负责GUI设计。李津松负责出题,解题算法的实现。本次讲解GUI的设计。
二、项目要求
1、所有功能通过图形化界面操作,可以是桌面应用,可以是网站
2、用户注册功能。用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册。
3、用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功。
4、密码设置成功后,跳转到选择界面,界面显示小学、初中和高中三个选项,用户点击其中之一后,提示用户输入需要生成的题目数量。
5、用户输入题目数量后,生成一张试卷。
6、最后一题提交后,界面显示分数,分数根据答对的百分比计算。
7、用户在分数界面可选择退出或继续做题。
三、项目实现
1.登陆界面。
package jiedui; import java.awt.*; import java.awt.event.*; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import javax.swing.*; import javax.swing.border.*; class Login extends Frame implements ActionListener// GUI设计 { Font font = new Font("宋体", Font.BOLD, 22); JFrame jframe = new JFrame("小初高数学学习系统"); JPanel jpanel1 = new JPanel(); JPanel jpanel2 = new JPanel(); JPanel jpanel3 = new JPanel(); JPanel jpanel4 = new JPanel(); JLabel jlabel0 = new JLabel("小初高数学学习系统", JLabel.CENTER); JLabel jlabel2 = new JLabel("账号:"); JLabel jlabel3 = new JLabel("密码:"); public JTextField jtextfield1 = new JTextField(10); public JTextField jtextfield2 = new JTextField(10); JButton jbutton1 = new JButton("登录"); JButton jbutton2 = new JButton("注册"); TitledBorder titleborder = new TitledBorder(""); public void init()// 显示登录界面 { jbutton1.addActionListener(this); jbutton2.addActionListener(this); jpanel2.add(jlabel2); jpanel2.add(jtextfield1); jpanel1.add(jlabel3); jpanel1.add(jtextfield2); jpanel3.add(jbutton1); jpanel3.add(jbutton2); jpanel4.setLayout(new GridLayout(4, 1));// 构造整个界面,一共4行1列 jlabel0.setFont(font); jpanel4.add(jlabel0); jpanel4.add(jpanel2); jpanel4.add(jpanel1); jpanel4.add(jpanel3); jframe.add(jpanel4); jframe.setLocation(500, 350);// 设置初始位置 jframe.setSize(400, 250);// 设置界面大小 jframe.setResizable(false); jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); jframe.setVisible(true); } public void actionPerformed(ActionEvent event)// 事件触发 { if (event.getActionCommand().equals("注册")) { jframe.setVisible(false); new Register().init();// 如果点击注册按钮,则实现注册部分 } if (event.getActionCommand().equals("登录")) { if (jtextfield1.getText().equals(""))// 如果用户名为空则提示 { JOptionPane.showMessageDialog(null, "请输入用户名!"); } else// 选择正确 { BufferedReader in = null; try { in = new BufferedReader(new FileReader("用户信息.txt")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } String line; int flag = 0;// 标记位,用来判断是否已经找到用户名,以及密码是否正确 try { while ((line = in.readLine()) != null)// 从用户信息中读取用户名和密码 { if (flag == 1)// 已经找到了对应的用户名 { if (line.equals(jtextfield2.getText())) break; // 密码正确 else { flag = 0;// 密码错误,标记位改回0 break; } } if (line.equals(jtextfield1.getText())) { flag = 1;// 找到了对应的用户名 } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { in.close();// 关闭文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (flag == 1) { JOptionPane.showMessageDialog(null, "登录成功!");// 密码正确,则登陆成功 new Choose().init(jtextfield1.getText());// 显示选择界面 jframe.setVisible(false); } else { JOptionPane.showMessageDialog(null, "用户不存在或密码错误!");// 反之登录失败 } } } } } public class main { public static void main(String[] args) { new Login().init(); } }

主要实现登录和注册功能,登录是读取用户信息.txt,如果正确登陆成功。注册是跳转到注册界面实现新用户注册。
2.注册界面
package jiedui; import java.awt.*; import java.awt.event.*; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.*; import javax.swing.border.*; class Register extends Frame implements ActionListener// GUI设计 { Font font = new Font("宋体", Font.BOLD, 20); JFrame jframe = new JFrame("小初高数学学习系统"); JPanel jpanel1 = new JPanel(); JPanel jpanel2 = new JPanel(); JPanel jpanel3 = new JPanel(); JPanel jpanel4 = new JPanel(); JPanel jpanel5 = new JPanel(); JPanel jpanel6 = new JPanel(); JLabel jlabel0 = new JLabel("注册界面", JLabel.CENTER); JLabel jlabel1 = new JLabel("手机号码:"); JLabel jlabel2 = new JLabel("密码:"); JLabel jlabel3 = new JLabel("验证码:"); JLabel jlabel4 = new JLabel("确认密码:"); public JTextField jtextfield1 = new JTextField(10); public JTextField jtextfield2 = new JTextField(10); public JTextField jtextfield3 = new JTextField(10); public JTextField jtextfield4 = new JTextField(10); JButton jbutton1 = new JButton("发送验证码"); JButton jbutton2 = new JButton("注册"); JButton jbutton3 = new JButton("返回"); TitledBorder titleborder = new TitledBorder(""); ButtonGroup buttongroup = new ButtonGroup(); boolean Legalpsword(String password)// 判断密码是否合法 { int min = 0, max = 0, num = 0; if (password.length() < 6 || password.length() > 10) // 检查密码长度 return false; for (int i = 0; i < password.length(); i++) { if (password.charAt(i) >= '0' && password.charAt(i) <= '9') // 检验数字 { num++; } else if (password.charAt(i) >= 'a' && password.charAt(i) <= 'z') // 检验大写字母 { min++; } else if (password.charAt(i) >= 'A' && password.charAt(i) <= 'Z') // 检验小写字母 { max++; } } if (num > 0 && min > 0 && max > 0) return true; else return false; } public void init()// 显示界面 { jbutton1.addActionListener(this); jbutton2.addActionListener(this); jbutton3.addActionListener(this);// 对三个按钮进行监听 jpanel1.add(jlabel1); jpanel1.add(jtextfield1); jpanel1.add(jbutton1);// 第一个面板加入标签、手机文本框、发送验证码按钮 jpanel2.add(jlabel2); jpanel2.add(jtextfield2);// 第二个面板加入密码标签、密码文本框 jpanel3.add(jlabel3); jpanel3.add(jtextfield3);// 第三个面板加入重复密码标签、密码文本框 jpanel4.add(jbutton2); jpanel4.add(jbutton3);// 第四个面板加入两个按钮注册,返回 jpanel5.setLayout(new GridLayout(6, 1));// 设置第五个面板(总面板)为网格布局 jpanel6.add(jlabel4); jpanel6.add(jtextfield4);// 第六个面板加入第四个标签以及文本框 jlabel0.setFont(font); jpanel5.add(jlabel0); jpanel5.add(jpanel1); jpanel5.add(jpanel2); jpanel5.add(jpanel6); jpanel5.add(jpanel3); jpanel5.add(jpanel4);// 将前面几个面板加入总面板 jframe.add(jpanel5);// 将总面板加入框架 jframe.setLocation(500, 350);// 设置位置 jframe.setSize(400, 300);// 设置界面大小 jframe.setResizable(false); jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); jframe.setVisible(true);// 设置可见 } String m_yzcode = "";// 读取到的验证码 public void actionPerformed(ActionEvent event)// 事件触发 { String usernum = jtextfield1.getText();// 输入的账号 String oldpwd = jtextfield2.getText();// 输入的密码 String firstpwd = jtextfield4.getText();// 确认的密码 String yanzheng = jtextfield3.getText();// 输入的验证码 if (event.getActionCommand().equals("发送验证码")) { if (usernum.equals(""))// 如果电话输入为空 { JOptionPane.showMessageDialog(null, "请输入手机号!"); } else { BufferedReader in = null; // 搜索是否存有该用户 try { in = new BufferedReader(new FileReader("用户信息.txt")); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } String line; int signal = 0;// 标记位 try { while ((line = in.readLine()) != null)// 从用户信息中读取用户名和密码 { if (line.equals(jtextfield1.getText())) { signal = 1;// 找到了对应的用户名 break; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { in.close();// 关闭文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (signal == 1)// 找到了已注册用户 { JOptionPane.showMessageDialog(null, "用户已注册!"); } else { try { Sendtext password = new Sendtext(); password.Sendcode(usernum); m_yzcode = password.m_Fcode;// 储存发送的验证码 } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } JOptionPane.showMessageDialog(null, "发送成功!"); } } } if (event.getActionCommand().equals("注册"))// 如果点击了注册按钮 { if (oldpwd.equals(""))// 如果密码输入为空 { JOptionPane.showMessageDialog(null, "请输入密码!"); } else if (oldpwd.equals(firstpwd) == false) { JOptionPane.showMessageDialog(null, "两次密码输入不同!"); } else if (yanzheng.equals(""))// 如果没有输入验证码 { JOptionPane.showMessageDialog(null, "请输入验证码!"); } else { if (Legalpsword(oldpwd) == false) // 检验密码合格性 { JOptionPane.showMessageDialog(null, "密码需要6-10位,必须包含大小写字母和数字!"); } else { if (m_yzcode.equals(yanzheng))// 如果验证码输入正确 { // FileWriter file = null; try { file = new FileWriter("用户信息.txt", true);// 写入用户信息 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { file.write(usernum + "\n"); file.write(oldpwd + "\n");// 将用户账户和密码存入文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { file.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } jframe.setVisible(false); JOptionPane.showMessageDialog(null, "注册成功!"); new Login().init();// 注册完成,返回登录界面 } else { JOptionPane.showMessageDialog(null, "验证码错误,重新输入!"); } } } } if (event.getActionCommand().equals("返回")) { jframe.setVisible(false); new Login().init(); } } }

主要设计了4个文本框来输入注册信息,手机号,密码,验证信息,输入完手机号点击发送验证码就可以向手机发送验证码,如果密码格式正确还有验证码输入正确即可注册成功。
发送验证码使用榛子云服务器实现。
package jiedui; import java.util.HashMap; import java.util.Map; import com.zhenzi.sms.ZhenziSmsClient; public class Sendtext { public String RandCode() { int m_rand = (int) ((Math.random() * 9 + 1) * 100000);// 生成6位的随机验证码 return String.valueOf(m_rand); } public static String m_Fcode = ""; public void Sendcode(String m_tnum) throws Exception { String m_temp = new Sendtext().RandCode(); m_Fcode = m_temp; ZhenziSmsClient client = new ZhenziSmsClient("https://sms_developer.zhenzikj.com", "110163", "863cdb8f-3034-479b-842b-8e6d716cf822"); Map<String, Object> params = new HashMap<String, Object>(); params.put("number", m_tnum); params.put("templateId", "7006"); String[] templateParams = new String[2]; templateParams[0] = String.valueOf(m_Fcode); m_Fcode = templateParams[0]; System.out.println(m_Fcode); templateParams[1] = "10"; params.put("templateParams", templateParams); try { String result = client.send(params); } catch (Exception e) { e.printStackTrace(); } } }
随机验证码发送到手机号。
3.登录界面
package jiedui; import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.border.*; public class Choose extends Frame implements ActionListener// GUI设计 { Font font = new Font("宋体", Font.BOLD, 20); JFrame jframe = new JFrame("小初高数学学习系统"); JPanel jpanel1 = new JPanel(); JPanel jpanel2 = new JPanel(); JPanel jpanel3 = new JPanel(); JPanel jpanel4 = new JPanel(); JLabel jlabel0 = new JLabel("请选择", JLabel.CENTER); JButton jbutton1 = new JButton("出题"); JButton jbutton2 = new JButton("修改密码"); TitledBorder titledborder = new TitledBorder(""); String name = ""; public void init(String n)// 登录成功后,进行选择操作 { name = n; jbutton1.addActionListener(this); jbutton2.addActionListener(this); jlabel0.setFont(font); jpanel2.add(jbutton1); jpanel2.add(jbutton2); jpanel3.setLayout(new GridLayout(4, 1)); jpanel3.add(jlabel0); jpanel3.add(jpanel2); jframe.add(jpanel3); jframe.setLocation(500, 350); jframe.setSize(400, 300); jframe.setResizable(false); jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); jframe.setVisible(true); } public void actionPerformed(ActionEvent event) { if (event.getActionCommand().equals("出题")) // 出题 { jframe.setVisible(false); new TypeNumber().init(); } if (event.getActionCommand().equals("修改密码")) // 修改密码 { jframe.setVisible(false); new Pwd().init(name); } } }

有两个选择按钮,出题和修改密码,实现了在登陆后方可出题还有修改密码功能。
4.修改密码
package jiedui; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.border.TitledBorder; class Pwd extends Frame implements ActionListener// GUI设计 { String name = ""; Font font = new Font("宋体", Font.BOLD, 20); JFrame jframe = new JFrame("小初高数学学习系统"); JPanel jpanel1 = new JPanel(); JPanel jpanel2 = new JPanel(); JPanel jpanel3 = new JPanel(); JPanel jpanel4 = new JPanel(); JPanel jpanel5 = new JPanel(); JPanel jpanel6 = new JPanel(); JLabel jlabel0 = new JLabel("修改密码界面", JLabel.CENTER); JLabel jlabel1 = new JLabel("账号:"); JLabel jlabel5 = new JLabel(name); JLabel jlabel2 = new JLabel("原密码:"); JLabel jlabel3 = new JLabel("新密码:"); JLabel jlabel4 = new JLabel("确认新密码:"); public JTextField jtextfield1 = new JTextField(10); public JTextField jtextfield2 = new JTextField(10); public JTextField jtextfield3 = new JTextField(10); JButton jbutton1 = new JButton("修改"); JButton jbutton2 = new JButton("返回"); TitledBorder titleborder = new TitledBorder(""); public void init(String name)// 显示登录界面 { jlabel5.setText(name); jbutton1.addActionListener(this); jbutton2.addActionListener(this);// 监听按钮的按下 jpanel1.add(jlabel1); jpanel1.add(jlabel5);// 第一个面板加入第一个标签和第五个标签 jpanel2.add(jlabel2); jpanel2.add(jtextfield1);// 第二个面板加入第二个标签和文本框 jpanel3.add(jlabel3); jpanel3.add(jtextfield2);// 第三个面板加入第三个标签和文本框 jpanel4.add(jlabel4); jpanel4.add(jtextfield3);// 第四个面板加入第四个标签和文本框 jpanel5.add(jbutton1); jpanel5.add(jbutton2);// 第五个面板加入两个按钮 jpanel6.setLayout(new GridLayout(6, 1));// 设置网格页面布局 jlabel0.setFont(font); jpanel6.add(jlabel0); jpanel6.add(jpanel1); jpanel6.add(jpanel2); jpanel6.add(jpanel3); jpanel6.add(jpanel4); jpanel6.add(jpanel5);// 依次将之前的面板加入总面板 jframe.add(jpanel6);// 将总面板加入框架 jframe.setLocation(500, 350);// 设置位置 jframe.setSize(400, 300);// 设置大小 jframe.setResizable(false);// 设置不可调整界面大小 jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); jframe.setVisible(true);// 设置可见 } boolean Legalpsword(String password)// 判断密码是否合法 { int min = 0, max = 0, num = 0; if (password.length() < 6 || password.length() > 10) return false;// 检查长度 for (int i = 0; i < password.length(); i++) { if (password.charAt(i) >= '0' && password.charAt(i) <= '9')// 检查数字 { num++; } else if (password.charAt(i) >= 'a' && password.charAt(i) <= 'z')// 检查小写字母 { min++; } else if (password.charAt(i) >= 'A' && password.charAt(i) <= 'Z')// 检查大写字母 { max++; } } if (num > 0 && max > 0 && min > 0) return true; else return false; } public void actionPerformed(ActionEvent event)// 事件触发 { if (event.getActionCommand().equals("修改"))// 点击修改按钮 { if (Legalpsword(jtextfield2.getText()) == false)// 如果密码不合法,则提示 { JOptionPane.showMessageDialog(null, "密码需要6-10位,必须含大小写字母和数字!"); } else if (jtextfield2.getText().equals(jtextfield3.getText()) == false)// 如果两次密码不相同,则提示 { JOptionPane.showMessageDialog(null, "两次输入的密码不一致!"); } else { BufferedReader in = null; try { in = new BufferedReader(new FileReader("用户信息.txt"));// 读取用户信息文件 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } PrintWriter out = null; try { out = new PrintWriter(new BufferedWriter(new FileWriter("temp.txt")));// 将用户信息写入一个新的文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } String line; int m_mark = 0, m_mark1 = 0;// 第一个标记位为是否找到账号,第二个为在找到账号的情况下原密码是输入正确 try { while ((line = in.readLine()) != null)// 如果能读到 { // System.out.println(m_mark); if (m_mark == 1)// 表示账号已经找到了 { out.println(line.replace(line, jtextfield3.getText()));// 写入新文件的密码修改成新的 m_mark = 0;// 标记位重置 if (line.equals(jtextfield1.getText())) m_mark1 = 1;// 如果相同,原密码输入正确 } else { out.println(line);// 复制即可 } if (line.equals(jlabel5.getText())) { m_mark = 1;// 找到账号,第一个标记位置为1 } } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { in.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.close(); File del_file = new File("用户信息.txt"); File h_file = new File("temp.txt");// 建立两个文件路径 if (m_mark1 == 0)// 如果原密码输入错误,则直接删掉新生成的用户信息文件,并提示原密码错误 { h_file.delete();// 删除新的文件 JOptionPane.showMessageDialog(null, "原密码错误!"); } else// 否则,删掉原来的用户信息文件,将新的文件重命名,提示修改密码成功并返回 { del_file.delete();// 删除原来的文件 h_file.renameTo(new File("用户信息.txt"));// 将新的文件命名 JOptionPane.showMessageDialog(null, "修改密码成功!");// 提示 jframe.setVisible(false); new Login().init();// 返回 } } } if (event.getActionCommand().equals("返回"))// 如果点击返回按钮,则回到登陆界面 { jframe.setVisible(false); new Login().init(); } } }

显示当前登录用户的账户信息,还有原密码与新密码的输入框,最后提交修改。修改密码的功能实现主要是读取用户信息.txt,原密码匹配正确,新密码有大小写数字情况下即可修改,并写用户信息.txt.。
5.出题界面
package jiedui; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.border.TitledBorder; class TypeNumber extends Frame implements ActionListener// GUI设计 { Font font = new Font("宋体", Font.BOLD, 20); JFrame jframe = new JFrame("小初高数学学习系统"); JPanel jpanel1 = new JPanel(); JPanel jpanel2 = new JPanel(); JPanel jpanel3 = new JPanel(); JPanel jpanel4 = new JPanel(); JLabel jlabel0 = new JLabel("请选择出题类型", JLabel.CENTER); JLabel jlabel1 = new JLabel("难度:"); JLabel jlabel2 = new JLabel("题目数量:"); JRadioButton jradiobutton1 = new JRadioButton("小学"); JRadioButton jradiobutton2 = new JRadioButton("初中"); JRadioButton jradiobutton3 = new JRadioButton("高中"); public JTextField jtextfield = new JTextField(10); JButton jbutton1 = new JButton("出题"); JButton jbutton2 = new JButton("返回"); TitledBorder titleborder = new TitledBorder(""); ButtonGroup buttongroup = new ButtonGroup(); int m_Questionnum = 0; public void init()// 显示出题界面 { jbutton1.addActionListener(this); jbutton2.addActionListener(this); jpanel1.add(jlabel1); jpanel1.add(jradiobutton1); jpanel1.add(jradiobutton2); jpanel1.add(jradiobutton3); jpanel2.add(jlabel2); jpanel2.add(jtextfield); jpanel3.add(jbutton1); jpanel3.add(jbutton2); jpanel4.setLayout(new GridLayout(4, 1)); jlabel0.setFont(font); jpanel4.add(jlabel0); jpanel4.add(jpanel1); jpanel4.add(jpanel2); jpanel4.add(jpanel3); jframe.add(jpanel4); buttongroup.add(jradiobutton1); buttongroup.add(jradiobutton2); buttongroup.add(jradiobutton3); jframe.setLocation(500, 350); jframe.setSize(400, 300); jframe.setResizable(false); jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); jframe.setVisible(true); } public void actionPerformed(ActionEvent event) { if (event.getActionCommand().equals("返回"))// 返回登录界面 { jframe.setVisible(false); new Login().init(); } if (event.getActionCommand().equals("出题"))// 进入题目 { int m_qnum = Integer.valueOf(jtextfield.getText()); if (jtextfield.getText().equals("") || m_qnum <= 0)// 如果题目数量为空或小于等于0则提示 { JOptionPane.showMessageDialog(null, "请输入合适的题目数量!"); } else if (!jradiobutton1.isSelected() && !jradiobutton2.isSelected() && !jradiobutton3.isSelected())// 如果没有选择类型则提示 { JOptionPane.showMessageDialog(null, "请选择出题难度!"); } else// 选择正确 { jframe.setVisible(false); String type = ""; if (jradiobutton1.isSelected()) type = "小学"; else if (jradiobutton2.isSelected()) type = "初中"; else if (jradiobutton3.isSelected()) type = "高中"; new Question().init(type, 1, m_qnum, 0); } } } }

可以选择出题类型和题目数量,进行不同模式的跳转。
6答题界面
package jiedui; import java.awt.Font; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.border.TitledBorder; class Question extends Frame implements ActionListener // GUI设计 { Font font = new Font("宋体", Font.BOLD, 22); JFrame jframe = new JFrame("小初高数学学习系统"); JPanel jpanel1 = new JPanel(); JPanel jpanel2 = new JPanel(); JPanel jpanel3 = new JPanel(); JPanel jpanel4 = new JPanel(); JPanel jpanel5 = new JPanel(); JPanel jpanel6 = new JPanel(); JPanel jpanel7 = new JPanel(); JLabel jlabel0 = new JLabel("答题界面", JLabel.CENTER); JLabel jlabelqnum = new JLabel(); JLabel jlabelques = new JLabel(); JLabel jlabela = new JLabel(); JLabel jlabelb = new JLabel(); JLabel jlabelc = new JLabel(); JLabel jlabeld = new JLabel(); JRadioButton jradiobutton1 = new JRadioButton("A."); JRadioButton jradiobutton2 = new JRadioButton("B."); JRadioButton jradiobutton3 = new JRadioButton("C."); JRadioButton jradiobutton4 = new JRadioButton("D."); JButton jbutton1 = new JButton("提交"); TitledBorder titleborder = new TitledBorder(""); ButtonGroup buttongroup = new ButtonGroup(); public static int m_cnt = 1;// 已出的题目数量 public static int total_number = 0;// 用来记录总的题目数量 public static String type1 = "";// 用来记录类型 public static String rightchoice = "";// 用来记录这道题正确的选项 public static int right_number = 0;// 用来记录当前算对的题目数量 public void init(String m_ss, int m_num, int m_tt, int m_right)// 显示出题界面 { type1 = m_ss;// 记录类型 String m_stringcnt = String.valueOf(m_num);// 记录题号的字符串 m_cnt = m_num;// 记录已出题目的数量 total_number = m_tt;// 记录题目总数 right_number = m_right;// 记录正确的题目数量 Make m_cal = new Make();// 建立一个出题类的方法 String m_question; while (true) { m_question = m_cal.FormPaper(m_ss);// 得出题目的字符串 FileWriter fw = null; try { fw = new FileWriter("test.txt", true);// 创建一个问题文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fw.close();// 关闭 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } BufferedReader in = null; try { in = new BufferedReader(new FileReader("test.txt"));// 读取问题文件 } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } String line; int m_mark = 0;// 标记位为是否问题重复 try { while ((line = in.readLine()) != null)// 如果能读到 { if (line.equals(m_question)) { m_mark = 1;// 问题重复了! break; } } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } try { in.close();// 关闭文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (m_mark == 0) break;// 如果不重复,这道题可以出,结束循环 } FileWriter fw = null; try { fw = new FileWriter("test.txt", true);// 打开问题文件 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fw.write(m_question + "\n");// 将问题存入 } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } File del_file = new File("test.txt"); if (m_cnt == total_number) del_file.delete();// 出完最后一题后清空文件 rightchoice = m_cal.rightchoice;// 储存正确选项 jlabela.setText(m_cal.m_A); jlabelb.setText(m_cal.m_B); jlabelc.setText(m_cal.m_C); jlabeld.setText(m_cal.m_D);// 储存四个选项的字符串 jlabelqnum.setText(m_stringcnt + "."); // 储存题号字符串 jlabelques.setText(m_question);// 将题目的字符串储存 jbutton1.addActionListener(this); jlabelqnum.setFont(font); jlabelques.setFont(font); jpanel1.add(jlabelqnum); jpanel1.add(jlabelques); jradiobutton1.setFont(font); jlabela.setFont(font); jpanel2.add(jradiobutton1); jpanel2.add(jlabela); jradiobutton2.setFont(font); jlabelb.setFont(font); jpanel5.add(jradiobutton2); jpanel5.add(jlabelb); jradiobutton3.setFont(font); jlabelc.setFont(font); jpanel6.add(jradiobutton3); jpanel6.add(jlabelc); jradiobutton4.setFont(font); jlabeld.setFont(font); jpanel7.add(jradiobutton4); jpanel7.add(jlabeld); jpanel3.add(jbutton1); jpanel4.setLayout(new GridLayout(7, 1)); jlabel0.setFont(font); jpanel4.add(jlabel0); jpanel4.add(jpanel1); jpanel4.add(jpanel2); jpanel4.add(jpanel5); jpanel4.add(jpanel6); jpanel4.add(jpanel7); jpanel4.add(jpanel3); jframe.add(jpanel4); buttongroup.add(jradiobutton1); buttongroup.add(jradiobutton2); buttongroup.add(jradiobutton3); buttongroup.add(jradiobutton4); jframe.setLocation(450, 200); jframe.setSize(500, 500); jframe.setResizable(false); jframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); jframe.setVisible(true); } public void actionPerformed(ActionEvent event) { if (event.getActionCommand().equals("提交"))// 点击提交 { m_cnt++; if (rightchoice == "A") { if (jradiobutton1.isSelected())// 正确答案为A { right_number++; JOptionPane.showMessageDialog(null, "正确"); } else { JOptionPane.showMessageDialog(null, "错误"); } } else if (rightchoice == "B") { if (jradiobutton2.isSelected())// 正确答案为B { right_number++; JOptionPane.showMessageDialog(null, "正确"); } else { JOptionPane.showMessageDialog(null, "错误"); } } else if (rightchoice == "C") { if (jradiobutton3.isSelected())// 正确答案为C { right_number++; JOptionPane.showMessageDialog(null, "正确"); } else { JOptionPane.showMessageDialog(null, "错误"); } } else if (rightchoice == "D") { if (jradiobutton4.isSelected())// 正确答案为D { right_number++; JOptionPane.showMessageDialog(null, "正确"); } else { JOptionPane.showMessageDialog(null, "错误"); } } jframe.setVisible(false);// 关闭界面 if (m_cnt <= total_number) new Question().init(type1, m_cnt, total_number, right_number); else new Score().init(total_number, right_number);// 进入评分 } } }

显示当前题号与题目,并由四个不同的选项,只有一个选项是对的,当选对时出现正确,不选或者选错显示错误并跳到下一题。


最后一题时出现得分以及继续答题或者返回的选项按钮

四、总结感想
本次实验大体上实现了基本功能,也了解了GUI的基本使用,学会排版,设计大小界面来使用户有更好的体验。过程中也出现一些错误,例如GUI显示不出来等,也是刚开始接触GUI,用法不是很了解。因为这次是结对编程,设计了GUI还不够,队友来实现出卷,以及计算结果,选项的设置等实现。两个人都完成后在实现融合在一起最后不断测试不断优化。在个人项目中我们实现了出卷系统,这次还涉及到用户的登录和使用,注册等,答卷时还要得出正确结果,这比个人项目复杂得多。但我们经过沟通后一人设计GUI一人设计出答卷的算法,过程中不断沟通来完善功能满足对方的设计需求,增强了团队能力。

浙公网安备 33010602011771号