作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232
GitHub 远程仓库的地址:https://github.com/RichardSkr/Simple-arithmetic-device
1. 开发环境
IDE :IntelliJ IDEA 2018.2.5 x64。
JDK:JDK_U801.
系统:Ubuntu x64.
编程语言:Java 语言
2. 需求分析
- 基本要求:
1)生成题目,单个题目最多不能超过 4 个运算符,操作数小于 100。
2)用户可以输入答案
3)若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。
- 扩展要求(选择方向):
1)程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是 2.67 而非 2.66,或保持分数形式: 8/3;
2)可以出表达式里含有负整数(负整数最小不小于 - 100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8;
3)用户答题结束以后,程序可以显示用户答题所用的时间;
4)用户可以选择出题的个数(最多不能超过 5 个题目),答题结束可以显示用户答错的题目个数和答对的题目个数;
5)程序可以出单个整数阶乘的题目:如:4!=24;
6)程序可以设置皮肤功能,可以改变界面的颜色即可。
3. 详细设计
在此次结队子中,我主要负责的部分是UI界面。
HBoxInstance类:
获得关于横向排列按钮的 bottom布局对象,bottom布局中包括 “交卷” “换一套” 两个按钮。
public HBox getBottomHBox() {
bottomHBox.setSpacing(50);
bottomHBox.setPadding(new Insets(20,100,0,180));
bottomHBox.setBackground(new Background(new BackgroundFill(new Color(0.2,0.2,0.0,0.1),
CornerRadii.EMPTY, Insets.EMPTY)));
nextBtn = new Button("换一套");
nextBtn.setPadding(new Insets(5,40,5,40));
submitBtn = new Button("交卷");
submitBtn.setPadding(new Insets(5,40,5,40));
bottomHBox.getChildren().addAll(submitBtn, nextBtn);
return bottomHBox;
}
VBoxInstance类:
主要试题界面:
1)mainHBox:
因为试题数是不确定的,所以试题标签Label,输入框TextField都是随着题数改变的,用for循环分配布局组部最好。
exerciseList = ExerciseUtils.getExerciseList(MainWork2.exerciseCount);
for (int i = 0; i < exerciseList.size(); i++) {
Label label = new Label("第" + (i + 1) + "题: " +
new String(ExerciseUtils.showExercise(i, exerciseList)).substring(2)
);
HBox hBox = new HBox();
hBox.setSpacing(80);
TextField textField = new TextField();
textField.setStyle("-fx-max-width: 80;-fx-max-height: 30");
textField.setFocusTraversable(false);
Label label1 = new Label("");
label1.setPadding(new Insets(3,0,0,0));
hBox.getChildren().addAll(textField,label1);
mainVBox.getChildren().addAll(label,hBox);
}return mainVBox;
}
rightHBox界面:
右边的界面,包括的主要UI组部,有image,秒刷顺计时画布canvas,换颜色的 按钮。
Pane imagePane = new Pane();
Canvas imageCanvas = new Canvas(100, 100);
Image image = new Image("image/***.PNG", 78, 135, false, false);
imagePane.setBackground(new Background(new BackgroundImage(image, BackgroundRepeat.NO_REPEAT,
BackgroundRepeat.NO_REPEAT, BackgroundPosition.DEFAULT, BackgroundSize.DEFAULT)));
imagePane.getChildren().add(imageCanvas);
Pane timePane = new Pane();
Canvas timeCanvas = new Canvas(100, 100);
rightPen = timeCanvas.getGraphicsContext2D();
timePane.getChildren().add(timeCanvas);
colorBtn = new Button("Color");
colorBtn.setPadding(new Insets(5,35,5,35));
colorBtn.setStyle(MainWork2.colorStyle);
rightVBox.getChildren().addAll(imagePane, timePane,colorBtn);
MainWork类:
类中利用线程处理 鼠标点击事件,线程每周期休眠0.1秒,每1秒刷新 顺时计时器Canvas。
HBox bottomHBox = new HBoxInstance().getBottomHBox();
VBox rightVBox = new VBoxInstance().getRightVBox();
GraphicsContext pen = VBoxInstance.rightPen;
startPaneInit(mainVBox);//开始界面
generateMain(borderPane,Boolean.FALSE);//键盘输入事件
Thread thread = new Thread(){
double time = 0;
public void run(){
while(true) {
HBoxInstance.nextBtn.setOnMouseClicked(event -> {}
HBoxInstance.submitBtn.setOnMouseClicked(event -> {}
VBoxInstance.colorBtn.setOnMouseClicked(event -> {}
if(state){
paintTime(time, pen);
try {
sleep(100);
time+=0.1;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
borderPane.setCenter(mainVBox);
borderPane.setRight(rightVBox);
borderPane.setBottom(bottomHBox);
4. 调试结果
开始界面

试题界面
交卷界面
点击换一套后
点击Color按键
5. 结对项目过程
姓名:何志威
学号:201606120074
结对成员博客地址:http://www.cnblogs.com/Richard-V/
分工:
1)成员 1:随机生成括号算法、生成阶乘题目算法、获取答案算法
2)成员 2:图形化界面设计、生成计时器、更改背景颜色功能
结对项目学习照片:
6. 总结
遇到的难点:
虽然大二时也学过javafx界面开发,但放下一年后对java的布局很陌生,并且在此次项目中深深体会到 用java代码写界面 很恶心(而且界面代码又和一些事件处理混在一起),幸亏javafx中有类似与css style的方法属性,使得在修改组件样式时会方便很多,因为不熟悉javafx的布局,所以对于布局也是各种胡乱调试,浪费了很多时间。因为一些事件会触发界面的刷新,所以在把触发界面更新的界面放到了线程中,但又因为线程引起了....
7. 时间表
PSP2.1 | Personal Software Process Stages | Time Senior Student(h) | Time(h) |
Planning | 计划 | 3 | 2 |
· Estimate | 估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 8 | 11 |
· Analysis | 需求分析 (包括学习新技术) | 1 | |
· Design Spec | 生成设计文档 | ||
· Design Review | 设计复审 | ||
· Coding Standard | 代码规范 | 0.5 | |
· Design | 具体设计 | 4 | 2.5 |
· Coding | 具体编码 | 12 | 15 |
· Code Review | 代码复审 | ||
· Test | 测试(自我测试,修改代码,提交修改) | 1.5 | |
Reporting | 报告 | ||
· | 测试报告 | ||
计算工作量 | |||
并提出过程改进计划 |