项目成员:张金生     张政

工程地址:

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. istio1.0.2配置

    项目的组件相对比较复杂,原有的一些选项是靠 ConfigMap 以及 istioctl 分别调整的,现在通过重新设计的Helm Chart,安装选项用values.yml或者 helm 命令行的方式来 ...

  2. Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-1-举例说明

    Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用 Compose 通过一个配置文件来管理多个Docker容器,在配置文件中 ...

  3. OpenCV——颜色缩减、计时函数、访问像素

    //颜色空间缩减 //src:源图片 //dst:目标图片 //divideWith:缩减宽度 void ColorSpaceReduction(Mat src,int divideWith,Mat& ...

  4. Docker学习5-Services – 服务(未完待续)

    扩展应用程序并启用负载平衡, 为此,必须在分布式应用程序的层次结构中提升一级:服务.在分布式应用程序中,应用程序的不同部分称为“服务”.例如,一个视频共享站点,它可能包含用于将应用程序数据存储在数据库 ...

  5. JAVA框架 Spring AOP注解

    一.准备工作: 1)导入jar包: 4个jar包. 2)约束:(spring需要所有的约束)有IOC约束和AOP 还有事务(tx)以及注解注入的约束(context). <?xml versio ...

  6. 关于css浮动的一点思考

    浮动到底是什么? 浮动核心就一句话:浮动元素会脱离文档流并向左/向右浮动,直到碰到父元素或者另一个浮动元素.请默念3次! 浮动最初设计的目的并没那么多事儿,就只是用来实现文字环绕效果而已,如下所示: ...

  7. ip、ifconfig命令与IP(转)

    Q:问题的要求就是在linux下不重新情况下,如何临时增加一个IP及临时删除一个IP ? A:该问题除了可以通过ifconfig命令完成外,也可以通过ip命令完成,不过两者是有区别的.ifconfig ...

  8. Codeforces round 1100

    Div 2 532 我对交互一无所知 只能寄期望与NOI和省选不出交互吧... E 这个题,真的是耻辱... 其实非常简单,就是二分+判环... 那么就直接二分答案+拓扑排序即可... (我居然在考试 ...

  9. 【WPF】给TextBox添上Label

    原文:[WPF]给TextBox添上Label 引言     在客户端开发中,要说出现频率大的控件,必定有TextBox的身影.然而在TextBox的旁边通常得有个基友Label,形影不离.为此,我们 ...

  10. Android开发——高斯模糊效果的简单实现

    0. 前言 在Android开发中,经常在音乐软件中看到高斯模糊效果. 在找遍了所有高斯模糊的算法代码后,发现stackblur的Java实现是最快的.效果如下所示. 1.  高斯模糊效果实现 Bit ...