项目成员:张金生     张政

工程地址:

https://coding.net/u/jx8zjs/p/paperOne/git

ssh://git@git.coding.net:jx8zjs/paperOne.git

需求:

  1.GUI支持:用户界面新增支持 Windows GUI,同时保留原有命令行下所有功能。

  2.配置文件:提供用户可用文本编辑器修改的配置文件,在其中包括用户名、当前难度、总答题数、答错题数、答对题数。

  3.错题本:可回放做错的题目,提供再次练习的机会/删除特定错题。

设计:

  1.GUI编程可以使用windowbuilder辅助编写;

  2.配置文件可以在程序运行时读入并初始化设定,并且在用户答题之后点击按钮同时将错题记录下来并保存到文件中;

  3.回放错题时,将错题保存在arraylist中,删除时根据指定删除特定行,并在用户提交时将新的错题集覆盖写入错题本中。

运行:

  由于提供了图形化界面,操作提示更加通俗易懂,具体效果会在后面结果中展示。需要注意的是,答题结果以及部分错误提示会在窗口正下方展示,而不是以弹窗的方式。

代码:

  1.初始参数声明:主要定义了窗口、问题、答案等。

  1. private JFrame frmPaperone;
  2. private JTextField textFieldNum;
  3.  
  4. QuestionGen qg = new QuestionGen();
  5.  
  6. ArrayList<String[]> questions = new ArrayList<String[]>();
  7. ArrayList<JTextField> answers = new ArrayList<JTextField>();
  8.  
  9. public MainWindow() {
  10. initialize();
  11.    }

  2.设置窗口:包括标签、按钮、输入框、排列方式等等。

  1. frmPaperone = new JFrame();
  2. frmPaperone.setTitle("PaperOne出题助手");
  3. frmPaperone.setBounds(100, 100, 761, 496);
  4. frmPaperone.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  5. frmPaperone.getContentPane().setLayout(new BorderLayout(0, 0));
  6. JPanel panelConfig = new JPanel();
  7. frmPaperone.getContentPane().add(panelConfig, BorderLayout.NORTH);
  8. JLabel lblNewLabel = new JLabel("出题难度");
  9. panelConfig.add(lblNewLabel);
  10. JComboBox<String> comboBoxComplex = new JComboBox<String>();
  11. comboBoxComplex.setModel(new DefaultComboBoxModel<String>(new String[] { "简单", "普通", "中等", "复杂" }));
  12. panelConfig.add(comboBoxComplex);
  13. JLabel label = new JLabel("出题数量");
  14. panelConfig.add(label);
  15. textFieldNum = new JTextField();
  16. textFieldNum.setText("10");
  17. panelConfig.add(textFieldNum);
  18. textFieldNum.setColumns(10);
  19. JLabel label_1 = new JLabel("运行模式");
  20. panelConfig.add(label_1);
  21. JComboBox<String> comboBoxMode = new JComboBox<String>();
  22. comboBoxMode.setModel(new DefaultComboBoxModel<String>(new String[] { "答题模式", "打印模式" }));
  23. panelConfig.add(comboBoxMode);
  24. JLabel label_2 = new JLabel("答题时间");
  25. panelConfig.add(label_2);
  26. JSpinner spinnerMinute = new JSpinner();
  27. panelConfig.add(spinnerMinute);
  28. JLabel label_3 = new JLabel("分");
  29. panelConfig.add(label_3);
  30. JSpinner spinnerSecond = new JSpinner();
  31. panelConfig.add(spinnerSecond);
  32. JLabel label_4 = new JLabel("秒");
  33. panelConfig.add(label_4);
  34. JPanel panelStatus = new JPanel();
  35. frmPaperone.getContentPane().add(panelStatus, BorderLayout.SOUTH);
  36. JLabel messageBar = new JLabel(" ");
  37. panelStatus.add(messageBar);
  38. JPanel panelMain = new JPanel();
  39. frmPaperone.getContentPane().add(panelMain, BorderLayout.CENTER);
  40. panelMain.setLayout(new MigLayout("", "[][grow]", "[][]"));

  3.设置按钮动作:点击“开始出题”按钮之后要进行的操作,包括检测用户输入的设置是否合法根据用户选择的难度出题检测用户选择的模式(答题模式或打印模式)答题模式下判断对错 等等。值得注意的是,在点击按钮时需要清空原本遗留的数据,比如Arraylist、JPanel等。

  1. JButton buttonStart = new JButton("开始出题");
  2. buttonStart.addMouseListener(new MouseAdapter() {
  3. public void mouseClicked(MouseEvent event) {
  4. frmPaperone.repaint();
  5. messageBar.setText("");
  6. String numstr = textFieldNum.getText();
  7. int complex = comboBoxComplex.getSelectedIndex();
  8. int mode = comboBoxMode.getSelectedIndex();
  9. panelMain.removeAll();    //初始化
  10. questions.clear();
  11. answers.clear();
  12. if (isNumeric(numstr)) {    //后续操作均是在用户输入合法条件下进行的
  13. int num = Integer.parseInt(numstr);
  14. for (int n = 0; n < num; n++) {
  15. String[] question = new String[2];
  16. switch (complex) {    //判断用户选择的出题难度
  17. case 0: {
  18. question[0] = qg.generateSimpleQuestion();
  19. break;
  20. }
  21. case 1: {
  22. question[0] = qg.generateCommonQuestion();
  23. break;
  24. }
  25. case 2: {
  26. question[0] = qg.generateMediumQuestion();
  27. break;
  28. }
  29. case 3: {
  30. question[0] = qg.generateComplexQuestion();
  31. break;
  32. }
  33. default:
  34. }
  35. try {
  36. question[0] = "Question " + (n + 1) + " :" + question[0];
  37. question[1] = qg.answer;
  38. questions.add(question);
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. switch (mode) {    //判断用户所选的模式
  44. case 0: {
  45. for (int m = 0; m < num; m++) {
  46. JLabel questionBar = new JLabel(" ");
  47. panelMain.add(questionBar, "cell 0 " + m + ",alignx trailing");
  48. JTextField answerBar = new JTextField("", 20);
  49. panelMain.add(answerBar, "cell 1 " + m + " ,alignx trailing");
  50. questionBar.setText(questions.get(m)[0]);
  51. answers.add(answerBar);
  52. }
  53. JButton saveButton = new JButton("保存到错题本");
  54. saveButton.addMouseListener(new MouseAdapter() {
  55. public void mouseClicked(MouseEvent event) {
  56.  
  57. }
  58. });
  59. saveButton.setVisible(false);
  60. panelStatus.add(saveButton);
  61.  
  62. JButton sudmitButton = new JButton("提交");
  63. sudmitButton.addMouseListener(new MouseAdapter() { //判断对错
  64. public void mouseClicked(MouseEvent event) {
  65. String faultQuestion = new String("");
  66. String correctAnswer = new String("");
  67. for (int s = 0; s < num; s++) {
  68. String answer = new String();
  69. answer = answers.get(s).getText();
  70. if (!answer.trim().equals(questions.get(s)[1])) {
  71. faultQuestion += (" " + (s + 1));
  72. correctAnswer += (" " + questions.get(s)[1]);
  73. }
  74. System.out.println(answers.get(s).getText());
  75. }
  76. if (faultQuestion.isEmpty() || faultQuestion == "") {
  77. messageBar.setText("恭喜你全部答对啦!真是个天才!");
  78. saveButton.setVisible(false);
  79. } else {
  80. messageBar.setText("很遗憾,你的第" + faultQuestion + "题答错了.正确答案分别是:" + correctAnswer);
  81. saveButton.setVisible(true);
  82. }
  83. }
  84. });
  85. panelMain.add(sudmitButton);
  86.  
  87. break;
  88. }
  89. case 1: {
  90. for (int m = 0; m < num; m++) {
  91. JLabel questionBar = new JLabel(" ");
  92. panelMain.add(questionBar);
  93. questionBar.setText(questions.get(m)[0] + "=" + questions.get(m)[1]);
  94. }
  95. break;
  96. }
  97. default:
  98. }
  99. } else {
  100. messageBar.setText("请输入数字!");
  101. }
  102. }
  103. });
  104. panelConfig.add(buttonStart);
  105. }

  4.判断输入合法性的函数。

  1. public static boolean isNumeric(String str) {
  2. Pattern pattern = Pattern.compile("[0-9]*");
  3. return pattern.matcher(str).matches();
  4. }

结果:

  1.主界面:

  

  2.答题模式:

  

  3.全部答对时:

  

  4.计算结果有误时:

  

  5.打印模式:

  

体会:

  争论点:

  1.打印方式  最初想法是逐个答题,答一道提交一道,然后再出下一道题;因为对用户不友好,故讨论新的展示方式;

  2.判断对错  主要是关于如何保存题目以及对应的答案的探讨。

  花费时间较长的问题:排版(Layout)问题。

简易四则运算生成程序——添加GUI支持的更多相关文章

  1. 为OLED屏添加GUI支持6:进度条控件

    为OLED屏添加GUI支持6:进度条控件 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...

  2. 为OLED屏添加GUI支持3:字库

    为OLED屏添加GUI支持3:字库 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:STM3 ...

  3. 为OLED屏添加GUI支持2:2D图形库

    为OLED屏添加GUI支持2:2D图形库 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...

  4. “四则运算生成程序——GUI支持和部分功能改进”链接

    项目成员:张金生     张政 <正文随笔发布在张金生博客中> 四则运算生成程序——GUI支持和部分功能改进

  5. 四则运算生成程序——GUI支持和部分功能改进

    项目成员:张金生     张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...

  6. [Unity3D][Vuforia][IOS]vuforia在unity3d中添加自己的动态模型,识别自己的图片,添加GUI,播放视频

    使用环境 unity3D 5 pro vuforia 4 ios 8.1(6.1) xcode 6.1(6.2) 1.新建unity3d工程,添加vuforia 4.0的工程包 Hierarchy中 ...

  7. 把自己Github上的代码添加Cocoapods支持

    转载请注明原链接:http://www.cnblogs.com/zhanggui/p/6003481.html 一.前言 这两天被cocoapods折磨的心力憔悴.看cocoapods官网的添加支持, ...

  8. Spring Boot 添加Shiro支持

    前言: Shiro是一个权限.会话管理的开源Java安全框架:Spring Boot集成Shiro后可以方便的使用Session: 工程概述: (工程结构图) 一.建立Spring Boot工程 参照 ...

  9. 在IntelliJ IDEA中添加框架支持时找不到Hibernate的解决办法

    问题描述 第一次在Add Frameworks support界面中添加hibernate支持的时候,异常中断,导致没有成功添加. 第二次进入Add Frameworks support窗口时,发现找 ...

随机推荐

  1. Nginx中配置http和https做反向代理

    参考:http://www.zslin.com/web/article/detail/73 1.安装 sudo apt-get install nginx 2.配置: http_demo.conf # ...

  2. 20155203 实验一《Java开发环境的熟悉》实验报告

    20155203 实验一<Java开发环境的熟悉>实验报告 一.实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Java程序. 二.练 ...

  3. 20155308 2016-2017-2《Java程序设计》课堂实践项目

    20155308 2016-2017-2<Java程序设计>课堂实践项目 在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅 ...

  4. 20155321 2016-2017-2 《Java程序设计》第四周学习总结

    20155321 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 第六.七章 继承 多态 接口 相应的语法细节 继承 关键字 extends 格式 class ...

  5. 20155338 2016-2017-2 《Java程序设计》第4周学习总结

    20155338 2016-2017-2 <Java程序设计>第4周学习总结 教材学习内容总结 内容有很多,这里这是选取几个比较重要的一部分来展示. 1.继承 •定义:继承基本上就是避免多 ...

  6. 深入浅出之-route命令实战使用指南

    本博文的视频讲解已发布:http://oldboy.blog.51cto.com/2561410/1119453 缘起:本文为老男孩linux培训第七次课前考试题及参考答案,有朋友在看完http:// ...

  7. 基于ejabberd简单实现xmpp群聊离线消息

    首先,xmpp服务器是基于ejabberd.离线消息模块是mod_interact,原地址地址:https://github.com/adamvduke/mod_interact: 修改后实现群聊离线 ...

  8. 强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods)

    强化学习读书笔记 - 13 - 策略梯度方法(Policy Gradient Methods) 学习笔记: Reinforcement Learning: An Introduction, Richa ...

  9. 一、初识 Django

    一.引子 Django最初设计用于具有快速开发需求的新闻类站点,目的是要实现简单快捷的网站开发! 从好的方面来看,Web 开发激动人心且富于创造性:从另一面来看,它却是份繁琐而令人生厌的工作.通过减少 ...

  10. idea下增加scala

    1 idea工具下,下载scala插件 2 idea下新建scala工程 File——New——module 如果按照上图,设置后点击下载,出现下图下载过慢情况下, 这里我选择了等待,大概等了半小时才 ...