四则运算生成程序——GUI支持和部分功能改进
工程地址:
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支持和部分功能改进的更多相关文章
- “四则运算生成程序——GUI支持和部分功能改进”链接
项目成员:张金生 张政 <正文随笔发布在张金生博客中> 四则运算生成程序——GUI支持和部分功能改进
- 结对编程-四则运算生成程序-GUI界面
201421123118 张中结 201421123098 胡丹丹 a.需求分析 这个程序做成GUI(可以是Windows PC 上的,也可以是Mac.Linux,web,手机上的),成为一个有基本功 ...
- 简易四则运算生成程序——添加GUI支持
项目成员:张金生 张政 工程地址: https://coding.net/u/jx8zjs/p/paperOne/git ssh://git@git.coding.net:jx8zjs/pap ...
- [功能改进]Live Writer发博支持“建分类、加标签、写摘要”
以前您在园子里用Windows Live Wirter发布博文是不是有以下三个不爽: 不爽1:如果想在发布随笔时新建分类并将随笔添加至该分类,需要先在博客后台添加分类,然后在Live Writer中刷 ...
- 四则运算之GUI
四则运算之GUI Coding克隆地址:https://git.coding.net/lvgx/pair_programming.git 目录: 一.前言 二.计划时间——PSP 三.接口设计 四 ...
- 为OLED屏添加GUI支持2:2D图形库
为OLED屏添加GUI支持2:2D图形库 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:MDK5.13 MCU:S ...
- sql server编写简洁四则运算表达式脚本实现计算批次功能(C#等其它编程语言也能直接用此通用表达式)
问题: 在数据库编程开发中,有时会遇到数据量比较大的情况,如果直接大批量进行添加数据.修改数据.删除数据,就会是比较大的事务,事务日志也比较大,耗时久的话会对正常操作造成一定的阻塞.虽不至于达到删库跑 ...
- Nginx 支持 WAF 防护功能实战
WAF(Web Application Firewall),中文名称叫做“Web应用防火墙 WAF的定义是这样的:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提 ...
- PHP 5.6正式发布:新特性、及功能改进介绍
经过了长时间的开发测试,新版本PHP程序(PHP5.6正式版)终于发布了.新版本中加入了一些实用的新特性,也摒弃了一些冗余的功能.同时,也对部分原有功能进行了改进.下面就一起看看PHP 5.6正式版到 ...
随机推荐
- istio1.0.2配置
项目的组件相对比较复杂,原有的一些选项是靠 ConfigMap 以及 istioctl 分别调整的,现在通过重新设计的Helm Chart,安装选项用values.yml或者 helm 命令行的方式来 ...
- Docker技术入门与实战 第二版-学习笔记-9-Docker Compose 项目-1-举例说明
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速在集群中部署分布式应用 Compose 通过一个配置文件来管理多个Docker容器,在配置文件中 ...
- OpenCV——颜色缩减、计时函数、访问像素
//颜色空间缩减 //src:源图片 //dst:目标图片 //divideWith:缩减宽度 void ColorSpaceReduction(Mat src,int divideWith,Mat& ...
- Docker学习5-Services – 服务(未完待续)
扩展应用程序并启用负载平衡, 为此,必须在分布式应用程序的层次结构中提升一级:服务.在分布式应用程序中,应用程序的不同部分称为“服务”.例如,一个视频共享站点,它可能包含用于将应用程序数据存储在数据库 ...
- JAVA框架 Spring AOP注解
一.准备工作: 1)导入jar包: 4个jar包. 2)约束:(spring需要所有的约束)有IOC约束和AOP 还有事务(tx)以及注解注入的约束(context). <?xml versio ...
- 关于css浮动的一点思考
浮动到底是什么? 浮动核心就一句话:浮动元素会脱离文档流并向左/向右浮动,直到碰到父元素或者另一个浮动元素.请默念3次! 浮动最初设计的目的并没那么多事儿,就只是用来实现文字环绕效果而已,如下所示: ...
- ip、ifconfig命令与IP(转)
Q:问题的要求就是在linux下不重新情况下,如何临时增加一个IP及临时删除一个IP ? A:该问题除了可以通过ifconfig命令完成外,也可以通过ip命令完成,不过两者是有区别的.ifconfig ...
- Codeforces round 1100
Div 2 532 我对交互一无所知 只能寄期望与NOI和省选不出交互吧... E 这个题,真的是耻辱... 其实非常简单,就是二分+判环... 那么就直接二分答案+拓扑排序即可... (我居然在考试 ...
- 【WPF】给TextBox添上Label
原文:[WPF]给TextBox添上Label 引言 在客户端开发中,要说出现频率大的控件,必定有TextBox的身影.然而在TextBox的旁边通常得有个基友Label,形影不离.为此,我们 ...
- Android开发——高斯模糊效果的简单实现
0. 前言 在Android开发中,经常在音乐软件中看到高斯模糊效果. 在找遍了所有高斯模糊的算法代码后,发现stackblur的Java实现是最快的.效果如下所示. 1. 高斯模糊效果实现 Bit ...