|
|
package com.wsf.mathapp.view;
|
|
|
|
|
|
import com.wsf.mathapp.controller.SceneManager;
|
|
|
import javafx.geometry.Insets;
|
|
|
import javafx.geometry.Pos;
|
|
|
import javafx.scene.Scene;
|
|
|
import javafx.scene.control.Button;
|
|
|
import javafx.scene.control.Label;
|
|
|
import javafx.scene.control.TextField;
|
|
|
import javafx.scene.layout.VBox;
|
|
|
import javafx.scene.text.Font;
|
|
|
|
|
|
/**
|
|
|
* 题目数量选择视图类,提供用户选择答题数量的界面.
|
|
|
* 允许用户输入10-30之间的题目数量,并开始答题.
|
|
|
*/
|
|
|
public class QuestionCountView {
|
|
|
private Scene scene;
|
|
|
private final SceneManager sceneManager;
|
|
|
private String level;
|
|
|
|
|
|
/**
|
|
|
* 构造函数,初始化题目数量选择视图.
|
|
|
*
|
|
|
* @param sceneManager 场景管理器,用于界面导航.
|
|
|
*/
|
|
|
public QuestionCountView(SceneManager sceneManager) {
|
|
|
this.sceneManager = sceneManager;
|
|
|
createScene();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建主场景,包含题目数量选择界面.
|
|
|
*/
|
|
|
private void createScene() {
|
|
|
VBox root = new VBox(20);
|
|
|
root.setPadding(new Insets(40));
|
|
|
root.setAlignment(Pos.CENTER);
|
|
|
|
|
|
// 创建标题标签
|
|
|
Label titleLabel = createTitleLabel();
|
|
|
|
|
|
// 创建级别显示标签
|
|
|
Label levelLabel = createLevelLabel();
|
|
|
|
|
|
// 创建数量输入框
|
|
|
TextField countField = createCountField();
|
|
|
|
|
|
// 创建开始答题按钮
|
|
|
Button startButton = createStartButton();
|
|
|
|
|
|
// 创建返回按钮
|
|
|
Button backButton = createBackButton();
|
|
|
|
|
|
// 创建状态标签
|
|
|
Label statusLabel = new Label();
|
|
|
|
|
|
// 设置按钮事件
|
|
|
setupStartButtonAction(startButton, countField, statusLabel);
|
|
|
setupBackButtonAction(backButton);
|
|
|
|
|
|
root.getChildren().addAll(
|
|
|
titleLabel, levelLabel, countField, startButton, backButton, statusLabel
|
|
|
);
|
|
|
|
|
|
scene = new Scene(root, 400, 400);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建标题标签.
|
|
|
*
|
|
|
* @return Label 标题标签对象.
|
|
|
*/
|
|
|
private Label createTitleLabel() {
|
|
|
Label titleLabel = new Label("选择题目数量");
|
|
|
titleLabel.setFont(Font.font(20));
|
|
|
return titleLabel;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建级别显示标签.
|
|
|
*
|
|
|
* @return Label 级别显示标签对象.
|
|
|
*/
|
|
|
private Label createLevelLabel() {
|
|
|
Label levelLabel = new Label();
|
|
|
levelLabel.setFont(Font.font(16));
|
|
|
return levelLabel;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建数量输入框.
|
|
|
*
|
|
|
* @return TextField 数量输入框对象.
|
|
|
*/
|
|
|
private TextField createCountField() {
|
|
|
TextField countField = new TextField();
|
|
|
countField.setPromptText("请输入题目数量 (10-30)");
|
|
|
countField.setMaxWidth(250);
|
|
|
countField.setPrefHeight(40);
|
|
|
return countField;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建开始答题按钮.
|
|
|
*
|
|
|
* @return Button 开始答题按钮对象.
|
|
|
*/
|
|
|
private Button createStartButton() {
|
|
|
Button startButton = new Button("开始答题");
|
|
|
startButton.setStyle("-fx-background-color: #4CAF50; -fx-text-fill: white; "
|
|
|
+ "-fx-font-size: 14px;");
|
|
|
startButton.setPrefSize(250, 45);
|
|
|
return startButton;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 创建返回按钮.
|
|
|
*
|
|
|
* @return Button 返回按钮对象.
|
|
|
*/
|
|
|
private Button createBackButton() {
|
|
|
Button backButton = new Button("返回");
|
|
|
backButton.setStyle("-fx-background-color: #757575; -fx-text-fill: white;");
|
|
|
backButton.setPrefSize(250, 40);
|
|
|
return backButton;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置开始答题按钮的点击事件.
|
|
|
*
|
|
|
* @param startButton 开始答题按钮.
|
|
|
* @param countField 数量输入框.
|
|
|
* @param statusLabel 状态标签.
|
|
|
*/
|
|
|
private void setupStartButtonAction(Button startButton, TextField countField,
|
|
|
Label statusLabel) {
|
|
|
startButton.setOnAction(e -> handleStartQuiz(countField, statusLabel));
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置返回按钮的点击事件.
|
|
|
*
|
|
|
* @param backButton 返回按钮.
|
|
|
*/
|
|
|
private void setupBackButtonAction(Button backButton) {
|
|
|
backButton.setOnAction(e -> sceneManager.showLevelSelectionView());
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 处理开始答题逻辑.
|
|
|
*
|
|
|
* @param countField 数量输入框.
|
|
|
* @param statusLabel 状态标签.
|
|
|
*/
|
|
|
private void handleStartQuiz(TextField countField, Label statusLabel) {
|
|
|
try {
|
|
|
String countText = countField.getText().trim();
|
|
|
if (countText.isEmpty()) {
|
|
|
showError(statusLabel, "请输入题目数量!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
int count = Integer.parseInt(countText);
|
|
|
if (count < 10 || count > 30) {
|
|
|
showError(statusLabel, "题目数量必须在10-30之间!");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 直接调用 showQuizView 并传递参数
|
|
|
sceneManager.showQuizView(level, count);
|
|
|
|
|
|
} catch (NumberFormatException ex) {
|
|
|
showError(statusLabel, "请输入有效的数字!");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 设置当前选择的题目级别.
|
|
|
*
|
|
|
* @param level 题目难度级别.
|
|
|
*/
|
|
|
public void setLevel(String level) {
|
|
|
this.level = level;
|
|
|
updateLevelDisplay();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 更新界面显示当前选择的级别.
|
|
|
*/
|
|
|
private void updateLevelDisplay() {
|
|
|
if (scene != null) {
|
|
|
VBox root = (VBox) scene.getRoot();
|
|
|
Label levelLabel = (Label) root.getChildren().get(1);
|
|
|
levelLabel.setText("当前级别: " + level);
|
|
|
levelLabel.setStyle("-fx-text-fill: #2196F3;");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 显示错误信息.
|
|
|
*
|
|
|
* @param label 状态标签对象.
|
|
|
* @param message 错误信息内容.
|
|
|
*/
|
|
|
private void showError(Label label, String message) {
|
|
|
label.setText(message);
|
|
|
label.setStyle("-fx-text-fill: red;");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 获取当前场景.
|
|
|
*
|
|
|
* @return Scene 题目数量选择界面的场景对象.
|
|
|
*/
|
|
|
public Scene getScene() {
|
|
|
return scene;
|
|
|
}
|
|
|
} |