四则运算GUI
coding地址:https://git.dev.tencent.com/qyj814/GUI.git
结对伙伴:李梦宇
一.题目要求
- 定制出题要求。每次出题时用户都可以在界面上定制如下参数:题目数量,算式数值范围(仅包括原始题目与最终结果的绝对值的数值范围),题目中最多有多少个运算符,题目中是否包含乘除法,题目中是否包含括号。在点击相应出题按钮后将生成题目文件(不包含答案)。参考界面如下所示:
2.做题功能。出题后,用户可以开始答题
3.判题功能。用户答题过程中或者全部完成后可以判断对错,并统计分数和时间。
4.请同学们在结对两人中选择一个更优秀的项目作为项目的起点,在其基础上进行增量修改,根据以上修改自己的四则运算软件。
5.本次界面可以用网页版或客户端任何一种形式完成。
二.代码分析
1.代码
2.类调用关系图
3.核心代码
(1)开始界面


public class BeginFrame extends JFrame { private JButton createButton; private JButton uploadButton; public BeginFrame() { // TODO Auto-generated constructor stub JPanel panel = new JPanel(); createButton = new JButton("生成题目文件"); createButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub JFrame frame = new InitFrame(); } }); panel.add(createButton); uploadButton = new JButton("上传文件,开始答题"); uploadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub int result = 0; //File file2 = null; String path = null; Component chatFrame = null; JFileChooser fileChooser = new JFileChooser(); FileSystemView fsv = FileSystemView.getFileSystemView(); fileChooser.setCurrentDirectory(fsv.getHomeDirectory()); fileChooser.setDialogTitle("请选择要上传文件的路径"); fileChooser.setApproveButtonText("确定"); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); result = fileChooser.showOpenDialog(chatFrame); if(JFileChooser.APPROVE_OPTION == result) { path = fileChooser.getSelectedFile().getPath(); //System.out.println("path"+path); } ArrayListarr = new ArrayList (); try { String encoding = "utf-8"; File file = new File(path); //File file = new File("result.txt"); if(file.isFile() && file.exists()) { InputStreamReader reader = new InputStreamReader(new FileInputStream(file),encoding); BufferedReader bufferedReader = new BufferedReader(reader); String lineText = null; while((lineText = bufferedReader.readLine()) != null) { arr.add(lineText); } reader.close(); } } catch (Exception ex) { // TODO: handle exception } ExerciseFrame frame = new ExerciseFrame(arr); } }); panel.add(uploadButton); JPanel jpanel2 = new JPanel(); jpanel2.setSize(400, 200); this.setLayout(new BorderLayout()); this.add(panel,BorderLayout.NORTH); this.add(jpanel2,BorderLayout.SOUTH); this.setSize(400, 300); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.pack(); } }
(2)生成题目


public class InitFrame extends JFrame { private JComboBoxlbComboBox; private JComboBox ubComboBox; private JTextField sumField; private JComboBox maxLengthBox; private JCheckBox isMultDiv; private JCheckBox isBracket; private JButton submitButton; public InitFrame() { JPanel leftPanel = new JPanel(); leftPanel.setLayout(new GridLayout(3, 3)); //leftPanel.setSize(50,150); JLabel boundLabel = new JLabel("数值范围"); lbComboBox = new JComboBox (); lbComboBox.addItem(String.valueOf(1)); ubComboBox = new JComboBox (); ubComboBox.addItem(String.valueOf(10)); ubComboBox.addItem(String.valueOf(100)); ubComboBox.addItem(String.valueOf(1000)); JLabel sumLabel = new JLabel("题目数量"); sumField = new JTextField(10); JLabel maxLengthLabel = new JLabel("运算符上限"); maxLengthBox = new JComboBox (); maxLengthBox.addItem(String.valueOf(5)); maxLengthBox.addItem(String.valueOf(6)); maxLengthBox.addItem(String.valueOf(7)); leftPanel.add(boundLabel); leftPanel.add(lbComboBox); leftPanel.add(ubComboBox); leftPanel.add(sumLabel); leftPanel.add(sumField); leftPanel.add(new JLabel("")); leftPanel.add(maxLengthLabel); leftPanel.add(maxLengthBox); this.setLayout(new BorderLayout()); this.add(leftPanel,BorderLayout.WEST); JPanel rightPanel = new JPanel(); rightPanel.setLayout(new GridLayout(2, 2)); JLabel isMultDivLabel = new JLabel("是否包含乘除法"); isMultDiv = new JCheckBox(); JLabel isBracketLabel = new JLabel("是否包含括号和乘除法"); isBracket = new JCheckBox(); //isBracketLabel.item rightPanel.add(isMultDivLabel); rightPanel.add(isMultDiv); rightPanel.add(isBracketLabel); rightPanel.add(isBracket); //rightPanel.add(tip); this.add(rightPanel,BorderLayout.EAST); JPanel underPanel = new JPanel(); submitButton = new JButton("开始出题"); submitButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub String minStr = lbComboBox.getSelectedItem().toString(); //System.out.println(minStr); String maxStr = ubComboBox.getSelectedItem().toString(); int min = Integer.parseInt(minStr); int max = Integer.parseInt(maxStr); if(max<=min) { System.out.println("文件生成失败,数值范围不合法!"); } else { String sumStr = sumField.getText(); //if(sumStr) try { int sum = Integer.parseInt(sumStr); } catch (Exception e2) { System.out.println("文件生成失败,题目数量不合法"); } int maxlen = Integer.parseInt(maxLengthBox.getSelectedItem().toString()); boolean flag1 = false; boolean flag2 = false; if(isMultDiv.isSelected()) flag1 = true; if(isBracket.isSelected()) { //flag1 = true; flag2 = true; } if(flag2) { int sum2 = Integer.parseInt(sumStr); //CreateFile.creater(sum2); CreateFile.creater(min, max, sum2, maxlen,1); System.out.println("文件生成成功!"); } else if(flag1) { int sum2 = Integer.parseInt(sumStr); //CreateFile.creater(sum2); CreateFile.creater(min, max, sum2, maxlen,2); System.out.println("文件生成成功!"); } else { int sum2 = Integer.parseInt(sumStr); //CreateFile.creater(sum2); CreateFile.creater(min, max, sum2, maxlen,3); System.out.println("文件生成成功!"); } } } }); underPanel.add(submitButton); this.add(underPanel,BorderLayout.SOUTH); this.setSize(500, 400); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.pack(); } }
(3)上传题目


public class UploadFrame extends JFrame{ public UploadFrame() { // TODO Auto-generated constructor stub int result = 0; //File file = null; String path = null; Component chatFrame = null; JFileChooser fileChooser = new JFileChooser(); FileSystemView fsv = FileSystemView.getFileSystemView(); fileChooser.setCurrentDirectory(fsv.getHomeDirectory()); fileChooser.setDialogTitle("请选择要上传文件的路径"); fileChooser.setApproveButtonText("确定"); fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); result = fileChooser.showOpenDialog(chatFrame); if(JFileChooser.APPROVE_OPTION == result) { path = fileChooser.getSelectedFile().getPath(); //System.out.println("path"+path); } } }
(4)答题


public class ExerciseFrame extends JFrame { //private J private JButton nextBtn; private JButton submitBtn; private JLabel label; private JLabel timeLabel; private JLabel stateLabel1; private JLabel stateLabel2; private JTextField ansField; private int res; private int correct; private int curr; private int sum; private ArrayListformu; private ArrayList correctAns; public void setFormu(ArrayList arr) { formu = new ArrayList (); correctAns = new ArrayList (); sum = 0; Iterator iterator = arr.iterator(); ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); ScriptEngine se = scriptEngineManager.getEngineByName("JavaScript"); while(iterator.hasNext()) { sum++; String string = (String)(iterator.next()); //System.out.println(string); String string2 = string.replace("/", "÷"); formu.add(string2); //System.out.println(string2); try { //System.out.println(se.eval(string)).toString()); correctAns.add((se.eval(string)).toString()); } catch (Exception e) { } } } public ExerciseFrame(ArrayList arr) { setFormu(arr); curr = 1; correct = 0; long beginTime = System.currentTimeMillis(); Iterator iterator1 = formu.iterator(); Iterator iterator2 = correctAns.iterator(); JPanel panel = new JPanel(); label = new JLabel((String)iterator1.next()+" = "); panel.add(label); ansField = new JTextField(5); panel.add(ansField); stateLabel1 = new JLabel("正误状态:"+String.valueOf(correct)+"/"+String.valueOf(sum)); panel.add(stateLabel1); stateLabel2 = new JLabel("进度:"+String.valueOf(curr)+"/"+String.valueOf(sum)); panel.add(stateLabel2); //long currTime = System.currentTimeMillis(); String string = String.format("%1$tM:%1$tS", System.currentTimeMillis() - beginTime); //System.out.println(string); // timeLabel.setText("用时"+string); // panel.add(timeLabel); nextBtn = new JButton("Next"); nextBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { //String string = String.format("%1$tM:%1$tS", System.currentTimeMillis() - beginTime); //timeLabel.setText(string); //System.out.println(string); submitBtn.setVisible(true); if(curr == sum-1) { nextBtn.setVisible(false); } //System.out.println(label.getText()); if(ansField.getText().toString().equals((String)iterator2.next())) correct++; curr++; stateLabel1.setText("正误状态:"+String.valueOf(correct)+"/"+String.valueOf(sum)); stateLabel2.setText("进度:"+String.valueOf(curr)+"/"+String.valueOf(sum)); label.setText((String)iterator1.next()+" = "); } }); panel.add(nextBtn); submitBtn = new JButton("submit"); submitBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String string = String.format("%1$tM:%1$tS", System.currentTimeMillis() - beginTime); //timeLabel.setText(string.substring(0,5)); stateLabel1.setVisible(false); stateLabel2.setVisible(false); nextBtn.setVisible(false); submitBtn.setVisible(false); ansField.setVisible(false); if(ansField.getText().toString().equals((String)iterator2.next())) correct++; label.setText("用时"+string+",共"+sum+"题,您一共答对了"+String.valueOf(correct)+"道题!"); } }); panel.add(submitBtn); panel.setSize(690, 300); //panel.setLayout(new FlowLayout()); // this.setLayout(null); JPanel jpanel2 = new JPanel(); jpanel2.setSize(30, 290); JPanel jPanel3 = new JPanel(); jPanel3.setSize(700, 20); this.setLayout(new BorderLayout()); this.add(panel,BorderLayout.WEST); this.add(jpanel2,BorderLayout.EAST); this.add(jPanel3,BorderLayout.SOUTH); this.setSize(700, 300); this.setLocationRelativeTo(null); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); //setSize(400, 300); } }
4.页面展示
开始界面
出题范围
做题状态
最后提示
三.总结
感觉这次作业比上次还要难,我和小伙伴两个人加起来一共做了有十个小时吧!我和我的搭档是室友,我俩有谁不会了就可以提出来一起解决,感觉这样提高了不少效率,这也让我感觉到了团队的力量吧!这次作业还是感到挺吃力的,原因还是基础不扎实,很多问题不懂,只好去查,去问。这次作业要不是有小伙伴一起,感觉自己都快写不下去了。
队友优点:认真负责,基础牢固,感觉就是很好!
我的优点:踏实肯干,有耐性吧!
这次作业我们俩应该算是合作的挺愉快了,我没时间的时候她写,她没时间的时候我写,有问题一起讨论,一起解决,合作的很愉快!