项目成员:张金生     张政

工程地址:

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

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

需求:

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

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

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

变更:

  1.支持倒计时:答题模式出题以后会自动计时,如果用未在规定时间内答完题目则会自动被提交试卷,答题时间和题目数量等相关。

  2.出题数目:变更前的版本会因为出题数量过多而界面显示不下,已改进为滚动模式防止溢出。

  3.错题本:错题本完善,可以记录错题,数量,甚至从错题本中抽取题目重做,也可以将错题本中的题目选择性删除。

  4.更详细的配置内容显示和编辑:记录用户名、总答题数、答错题数,可以编辑这些信息。

设计:

  1.倒计时:使用单例模式线程,每秒缩减答题时间一秒,倒计时时间到则触发提交按钮完成抢卷功能,选择单例模式也是防止多次生成题目导致倒计时速度加快的问题。

  2.变更前使用的Jpanel控件和MigLayout,这样可以方便显示题目并且可以控制题目格式布局,不过题目过大需要手动调节窗口,否则会有部分题目超出浏览范围。改进后使用JScrollPane,并设置为MigLayout,同样达到了控制布局的效果,也能将原来显示不下的题目通过滚动条拖拽的方式显示出来。

  3.打开错题本可以看到每道错题前均有复选框用于删除题目,错题删除采用JCheckBox在题目前显示,根据勾选情况获取到题目的编号进行删除,最后再重写到错题本中。

  4.点击编辑信息按钮则在工作区显示编辑的项目,提交即可。

部分代码实现:

1.1倒计时实现:

 class MyThread extends Thread {
private MyThread(){ }
private static MyThread instance =null;
public static MyThread getInstance(){
if(instance==null){
instance = new MyThread();
}
return instance;
}
public void run() {
while (MainWindow.time > 0) {
MainWindow.time--;
MainWindow.lblTime.setText(MainWindow.time + "");
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
if (MainWindow.subOnClick == 1) {
return;
} } MainWindow.submitButton.doClick(); }
}

1.2倒计时的使用:生成题目后加入此段代码,保证只创建一个计时线程,并且线程不会被重复启动

 try{
MyThread.getInstance().start();
}catch (Exception e1) {
// TODO: handle exception
}

2.带有滚动条的题目显示面板:然后题目加入到包裹在JScrollpane下的Jpanel中,减少对原有代码的修改量

         private JScrollPane scrollPane = new JScrollPane();
scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
frmPaperone.getContentPane().add(scrollPane, BorderLayout.CENTER); scrollPane.add(panelMain);
panelMain.setLayout(new MigLayout("", "[][grow]", "[][]"));
scrollPane.setViewportView(panelMain);

3.错题本的编辑和题目删除:

 // 错题本按钮
buttonWrong.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 初始化
subOnClick = 1;
panelMain.removeAll();
frmPaperone.repaint();
int m = 0;
int num = Wrong.size();
for (int i = 0; i < num; i++) {
String[] wrong = Wrong.get(i);
JCheckBox chckbxNewCheckBox = new JCheckBox("");
// chckbxNewCheckBox.setText(wrong[0] + "=" + wrong[1]);
panelMain.add(chckbxNewCheckBox, "cell 0 " + m + ",alignx trailing"); JLabel wrongBar = new JLabel("");
panelMain.add(wrongBar, "cell 1 " + m + ",alignx 0");
wrongBar.setText(wrong[0] + "=" + wrong[1]);
m++;
}
// 删除按钮
ArrayList<Integer> al = new ArrayList<>();
btnDelete.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { Component[] compnent = panelMain.getComponents();
for (int i = 0; i < num * 2; i++) {
try {
JCheckBox tmp = (JCheckBox) compnent[i];
if (tmp.isSelected()) {
al.add(i / 2);
}
} catch (Exception e1) {
continue;
}
}
for (int d = al.size() - 1; d >= 0; d--) {
Wrong.remove(Wrong.get(al.get(d)));
}
messageBar.setText("删除成功!");
RewriteNote();
al.clear();
frmPaperone.repaint();
buttonWrong.doClick();
}
}); panelMain.add(btnDelete, "cell 1 " + m + ",alignx trailing"); }
});

4.编辑用户信息:

         // 修改信息按钮

         btnEdit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panelMain.removeAll();
panelMain.add(lblUserNameEdit, "cell 0 0,alignx trailing"); textFieldUs.setText(username);
panelMain.add(textFieldUs, "cell 1 0,alignx trailing");
textFieldUs.setColumns(10); panelMain.add(lblNumRightEdit, "cell 0 1,alignx trailing"); panelMain.add(NumSumEdit, "cell 1 1,alignx trailing");
NumSumEdit.setText(SumOfA + ""); panelMain.add(lblNumWrongEdit, "cell 0 2,alignx trailing"); panelMain.add(NumWrongEdit, "cell 1 2,alignx trailing");
NumWrongEdit.setText(SumOfE + ""); panelMain.add(reButton, "cell 0 3,alignx trailing");
panelMain.add(saveButton, "cell 1 3,alignx trailing");
subOnClick = 1;
panelMain.repaint();
}
}); // 保存按钮
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panelMain.removeAll(); username = textFieldUs.getText();
messageBar.setText("用户名已修改为" + username);
UserName.setText(username);
RewriteNote(); frmPaperone.repaint();
} }); // 重置按钮
reButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
panelMain.removeAll(); SumOfA = 0;
SumOfE = 0;
Wrong.clear();
messageBar.setText("重置成功");
NumSum.setText(SumOfA + "");
NumWrong.setText(SumOfE + "");
RewriteNote(); frmPaperone.repaint(); } });

运行截图:

打开程序选择编辑按钮

将用户名修改

变更成功

出题10道,简单难度答题时间60秒,7秒后变为53秒

简单难度50道题目,总答题时间为260秒,侧边滚动条可以拖拽显示原本超出屏幕的内容。

打开错题本

删除其中的前三道题目

删除错题本选中的错题后将剩余的题目作为试卷出题,达到错题重做的目的。

难度设置

结对体会:

面对不同的需求可能两个人会有不同的解决方案,也许会想出非常简单的设计方法让其实现简单化。在设计程序的交互上也采取尽量不弹框的原则,将要提示的内容显示在程序的状态栏上,省去用户的冗余点击事件也算是友好交互的探索。

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

工程地址:

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

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

四则运算生成程序——GUI支持和部分功能改进的更多相关文章

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

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

  2. 结对编程-四则运算生成程序-GUI界面

    201421123118 张中结 201421123098 胡丹丹 a.需求分析 这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一个有基本功 ...

  3. 简易四则运算生成程序——添加GUI支持

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

  4. [功能改进]Live Writer发博支持“建分类、加标签、写摘要”

    以前您在园子里用Windows Live Wirter发布博文是不是有以下三个不爽: 不爽1:如果想在发布随笔时新建分类并将随笔添加至该分类,需要先在博客后台添加分类,然后在Live Writer中刷 ...

  5. 四则运算之GUI

    四则运算之GUI Coding克隆地址:https://git.coding.net/lvgx/pair_programming.git   目录: 一.前言 二.计划时间——PSP 三.接口设计 四 ...

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

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

  7. sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)

    问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...

  8. Nginx 支持 WAF 防护功能实战

    WAF(Web Application Firewall),中文名称叫做“Web应用防火墙 WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...

  9. PHP 5.6正式发布:新特性、及功能改进介绍

    经过了长时间的开发测试,新版本PHP程序(PHP5.6正式版)终于发布了.新版本中加入了一些实用的新特性,也摒弃了一些冗余的功能.同时,也对部分原有功能进行了改进.下面就一起看看PHP 5.6正式版到 ...

随机推荐

  1. 【转】浅谈一个网页打开的全过程(涉及DNS、CDN、Nginx负载均衡等)

    1.概要 从用户在浏览器输入域名开始,到web页面加载完毕,这是一个说复杂不复杂,说简单不简单的过程,下文暂且把这个过程称作网页加载过程.下面我将依靠自己的经验,总结一下整个过程.如有错漏,欢迎指正. ...

  2. 2018.4.26 Mac安装Redis5.0.3版本服务器

    Mac安装Redis服务器 安装 1.到官网下载 选择稳定版本 打开官网:https://redis.io/ 2.下载完成后,打开命令行工具,执行解压命令 tar zxvf redis-5.0.3.t ...

  3. java.lang.NoSuchMethodError: No static method getFont

    最近在Android Studio升级3.0后,在AlertDialog弹窗时报出了如下问题: java.lang.NoSuchMethodError: No static method getFon ...

  4. css实现气泡框效果

    前提:气泡框或者提示框是网页很常见的,实现它的方式有很多,我们以前最常用的就是切图片 然后通过 "定位" 方式 定位到相应的位置,但是用这种方式维护很麻烦,比如设计师想改成另外一种 ...

  5. python3 Beautifulsoup <class 'bs4.element.ResultSet'> <class 'bs4.element.Tag'> 取值

    1.<class 'bs4.element.ResultSet'>  这里是字典外套了一个列表  textPid = pid[0] 2.<class 'bs4.element.Tag ...

  6. 解决Git在添加ignore文件之前就提交了项目无法再过滤问题

    由于未添加ignore文件造成提交的项目很大(包含生成的二进制文件).所以我们可以将编译生成的文件进行过滤,避免添加到版本库中了. 首先为避免冲突需要先同步下远程仓库 $ git pull 在本地项目 ...

  7. pycharm如何在虚拟环境中引入别人的项目

    如果你想引入别人的项目,但是呢引入的项目可能与自己原先装的模块的版本产生冲突,而且如果引入一个项目就在本地进行运行使用,每个项目用的依赖包都不大相同,就会导致解释器安装包过多,就会导致加载过慢,甚至会 ...

  8. Android Studio Xposed模块编写(一)

    1.环境说明 本文主要参考https://my.oschina.net/wisedream/blog/471292?fromerr=rNPFQidG的内容,自己实现了一遍,侵权请告知 已经安装xpos ...

  9. 4星|《流量池》:Luckin Coffee营销操盘手经验谈

    流量池:“急功近利”的流量布局.营销转化 作者是一线营销操盘手,全书是作者的经验总结,这样的作者在营销类图书中比较罕见,因此这本书非常有价值. 全书是写给巨头之外的企业营销人员看的,这样的企业的流量来 ...

  10. B1014. 福尔摩斯的约会

    14/20 #include<bits/stdc++.h> using namespace std; map<char,string> day; int main(){ day ...