项目成员:张金生     张政

工程地址:

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. (mac系统下)mysql 入门

    1.安装好mysql之后并且服务启动,系统偏好设置里有启动mysql服务的按钮 看到running表示可用 2.通过终端访问mysql 先到mysql的路径下(默认安装没有配置环境变量):cd /us ...

  2. 一个web项目web.xml的配置中<context-param>配置作用

    <context-param>的作用: web.xml的配置中<context-param>配置作用 1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件 ...

  3. 杀掉gpu上的程序

    https://blog.csdn.net/flysky_jay/article/details/82142254 当然也可以使用top找进程,但这种方式更好

  4. Android4.4 ContentResolver查询图片无效 及 图库删除 增加图片后,ContentResolver不更新的问题解决

    问题背景: 参考链接 做了一个图片浏览,用ContentResolver扫描图库照片,且严格按照时间拍摄顺序排好序显示在listview里.如下图所示: 遇到的问题是在4.2的手机上能正常显示,但是新 ...

  5. jpa实例

    ORM框架新的JPA ORM规范:1)JPA为POJO提供持久化标准规范.2)JPA的使用:Hibernate与TopLink以及OpenJpa都提供了JPA的实现.3)JPA主要技术:  A.ORM ...

  6. windows10+Python3.6+Anaconda3+tensorflow1.10.0配置和安装

    windows10+Python3.6+Anaconda3+tensorflow1.10.0# Anaconda3安装自行下载安装,之后dos或Anaconda Prompt终端查看Anaconda3 ...

  7. JAVA框架 Spring 入门

    一.阐述: IoC:我们以前写的框架虽然我们已经进行分层,web.业务层.持久层.但是各个层之间的关系.耦合性比较高,那个层调用其他层的时候,需要new对应层的类的对象,这样的话,我们以后做修改的时候 ...

  8. css动画,展开折叠图标

    @keyframes packupArrowFlow { 0% { bottom:; } 70% { bottom: 10px; } } @-webkit-keyframes packupArrowF ...

  9. Android 一s个相对完整的自动升级功能实现代码

    由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...

  10. DB2创建function(二)

    DB2创建function(一),介绍将function内容作为字段值,或做为一个where条件的情况. DB2创建function(二),介绍返回的内容为一个集合的情况.调用结果集的示例如下: se ...