结对编程总结

一、简介

  本次博客介绍结对编程(中小学出卷系统),采用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一人设计出答卷的算法,过程中不断沟通来完善功能满足对方的设计需求,增强了团队能力。

 

posted @ 2021-10-10 14:00  葉超  阅读(34)  评论(0)    收藏  举报