作業要求來自于: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 | 報告 | ||
· | 測試報告 | ||
計算工作量 | |||
并提出過程改進計劃 |