项目成员:张金生     张政

工程地址:

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. CentOS7创建本地YUM源的三种方法

    这篇文章主要介绍了CentOS7创建本地YUM源的三种方法,本文讲解了使用CentOS光盘作为本地yum源.如何为CentOS创建公共镜像.创建完全自定义的本地源等内容,需要的朋友可以参考下     ...

  2. WorldWind源码剖析系列:网络下载类WebDownload

    网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作.该类使用了两个委托类型和一个枚举类型. 该类的类图如下. 网络下载类WebDownload各个字段和属性的含义说明如下: st ...

  3. vector,deque,list的区别和使用

    vector: 表示一段连续的内存区域,每个元素被顺序存储在这段内存中,对vector的随机访问效率很高,但对非末尾元素的插入和删除则效率非常低. deque: 也表示N段连续的内存区域组成,但与ve ...

  4. 安装ubuntu系统 ——分区

    安装ubuntu 系统主要分四个区 目录 建议大小 格式 描述 / 10G-20G ext4 根目录 swap <2048M swap 交换空间 /boot 400M左右 ext4 Linux的 ...

  5. P3195 [HNOI2008]玩具装箱TOY

    列出DP方程式:设f[i]表示分组完前i件物品的最小花费,为方便计算,设sum[i]表示是前i件物品的长度和. f[i]=min(f[j]+(sum[i]-sum[j]+i-j-L-1)^2) [0& ...

  6. odoo 打印格式中 打印第一个数据默认

    <table style="width:100%;"> <tr> <td style="word-wrap:break-word;width ...

  7. 【vue】MongoDB+Nodejs+express+Vue后台管理项目Demo

    ¶项目分析 一个完整的网站服务架构,包括:   1.web frame ---这里应用express框架   2.web server ---这里应用nodejs   3.Database ---这里 ...

  8. ccf201703-1分蛋糕

    问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an.小明想分给每个朋友至少重量为k的蛋糕.小明的朋友们已经排好队准备领蛋糕,对于每个朋 ...

  9. [CF986F]Oppa Funcan Style Remastered[exgcd+同余最短路]

    题意 给你 \(n\) 和 \(k\) ,问能否用 \(k\) 的所有 \(>1\) 的因子凑出 \(n\) .多组数据,但保证不同的 \(k\) 不超过 50 个. \(n\leq 10^{1 ...

  10. stl源码剖析 详细学习笔记 算法(1)

    //---------------------------15/03/27---------------------------- //算法 { /* 质变算法:会改变操作对象之值 所有的stl算法都 ...