Java 你能帮我弄清楚如何在我的测验程序中组织数据吗?
我正在用JavaFX做一个选择题测验。每个问题都包含问题、可能的答案和正确的答案。下面我有一些工作代码,但都在一个类中。我意识到我应该在另一个类(或多个类)中拥有数据,并且我不应该使用并行数组。另一个类还应该包含设置问题标签和答案按钮上的文本以及在用户按下“下一步”时更改它们的方法。我还需要一种方法让用户知道他们的答案是否正确。 问题是我不知道如何组织数据以及如何使另一个类中的方法与GUI交互。你能给我一些关于如何完成这项任务的想法吗Java 你能帮我弄清楚如何在我的测验程序中组织数据吗?,java,javafx,Java,Javafx,我正在用JavaFX做一个选择题测验。每个问题都包含问题、可能的答案和正确的答案。下面我有一些工作代码,但都在一个类中。我意识到我应该在另一个类(或多个类)中拥有数据,并且我不应该使用并行数组。另一个类还应该包含设置问题标签和答案按钮上的文本以及在用户按下“下一步”时更改它们的方法。我还需要一种方法让用户知道他们的答案是否正确。 问题是我不知道如何组织数据以及如何使另一个类中的方法与GUI交互。你能给我一些关于如何完成这项任务的想法吗 import javafx.application.Appl
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.TilePane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
public class Quiz extends Application {
private int questionNumber = 0 ;
private int max = 5;
String[] question = new String[max];
String [] answer1 = new String[max];
String [] answer2 = new String [max];
String [] answer3 = new String[max];
Label label = new Label();
Label userAnswer = new Label();
RadioButton choice1 = new RadioButton();
RadioButton choice2 = new RadioButton();
RadioButton choice3 = new RadioButton();
ToggleGroup answers = new ToggleGroup();
Button next = new Button("Next");
RadioButton userAnswered;
TilePane buttons = new TilePane();
Button answer = new Button("Answer");
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
question[0]= "What's the capital of Monaco?";
question[1] = "What's the capital of San Marino?";
question[2] = "What's the capital of Lithuania?";
question[3] = "What's the capital of Denmark?";
question[4] = "What's the capital of Finland?";
label.setFont(new Font("Cambria", 26));
label.setTranslateY(230);
label.setTranslateX(230);
label.setText(question[0]);
HBox answerArea = new HBox();
answerArea.setTranslateY(330);
answerArea.setTranslateX(260);
answerArea.setSpacing(20);
answer1 [0] = "Monte Carlo";
answer1 [1] = "San Marino";
answer1 [2] = "Kaunas";
answer1 [3] = "Copenhagen";
answer1 [4] = "Tampere";
answer2[0] = "Monaco";
answer2[1] = "Kairo";
answer2[2] = "Warsav";
answer2[3] = "Oslo";
answer2 [4] = "Helsinki";
answer3 [0]= "Tirana";
answer3 [1]= "Zagreb";
answer3 [2]= "Vilnius";
answer3 [3]= "Stockholm";
answer3 [4]= "Turku";
choice1.setText(answer1[0]);
choice2.setText(answer2[0]);
choice3.setText(answer3[0]);
choice1.setToggleGroup(answers);
choice2.setToggleGroup(answers);
choice3.setToggleGroup(answers);
answer.setMaxWidth(Double.MAX_VALUE);
answer.setOnAction(e -> questionAnswered());
answers.selectedToggleProperty().addListener(new ChangeListener<Toggle>() {
@Override
public void changed(ObservableValue<? extends Toggle> observable, Toggle oldValue, Toggle newValue) {
userAnswered = (RadioButton) newValue.getToggleGroup().getSelectedToggle(); // Cast objekt to radiobutton
}
});
userAnswer.setTranslateY(280);
userAnswer.setTranslateX(360);
userAnswer.setFont(new Font("Cambria", 16));
answerArea.getChildren().addAll(choice1, choice2, choice3);
next.setOnAction(e -> nextQuestion());
next.setMaxWidth(Double.MAX_VALUE);
buttons.setTranslateY(400);
buttons.setTranslateX(280);
buttons.setHgap(5);
buttons.getChildren().addA(next);
answer.setTranslateX(550);
answer.setTranslateY(330);
Stage stage = new Stage();
Pane pane = new Pane();
pane.setStyle("-fx-background-color: #FFFFFF;");
Scene scene = new Scene(pane, 800, 500);
stage.setScene(scene);
stage.setResizable(false);
stage.show();
pane.getChildren().addAll(label, answerArea, buttons, answer, userAnswer);
}
public void questionAnswered(){
if (userAnswered.equals(choice2)) {
userAnswer.setText("Correct");
} else {
userAnswer.setText("Wrong answer");
}
}
public void nextQuestion() {
questionNumber = (questionNumber + 1) % question.length ;
label.setText(question[questionNumber]);
choice1.setText(answer1[questionNumber]);
choice2.setText(answer2[questionNumber]);
choice3.setText(answer3[questionNumber]);
userAnswer.setText(" ");
});
}
}
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.control.*;
导入javafx.scene.layout.HBox;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.TilePane;
导入javafx.scene.text.Font;
导入javafx.stage.stage;
公开课测验扩展应用{
私有整数=0;
私有int max=5;
字符串[]问题=新字符串[max];
字符串[]answer1=新字符串[max];
字符串[]answer2=新字符串[max];
String[]answer3=新字符串[max];
标签=新标签();
Label userAnswer=新标签();
RadioButton choice1=新的RadioButton();
RadioButton choice2=新的RadioButton();
RadioButton choice3=新的RadioButton();
ToggleGroup answers=新建ToggleGroup();
按钮下一步=新按钮(“下一步”);
无线按钮用户应答;
TilePane按钮=新的TilePane();
按钮应答=新按钮(“应答”);
公共静态void main(字符串[]args){
发射(args);
}
@凌驾
public void start(Stage primaryStage)引发异常{
问题[0]=“摩纳哥的首都是什么?”;
问题[1]=“圣马力诺的首都是什么?”;
问题[2]=“立陶宛的首都是什么?”;
问题[3]=“丹麦的首都是什么?”;
问题[4]=“芬兰的首都是什么?”;
label.setFont(新字体(“Cambria”,26));
标签:setTranslateY(230);
标签:setTranslateX(230);
label.setText(问题[0]);
HBox应答区=新HBox();
回答区:setTranslateY(330);
回答区:setTranslateX(260);
应答区。设置间隔(20);
回答1[0]=“蒙特卡罗”;
答复1[1]=“圣马力诺”;
答复1[2]=“考纳斯”;
答复1[3]=“哥本哈根”;
答复1[4]=“坦佩雷”;
答复2[0]=“摩纳哥”;
答复2[1]=“Kairo”;
回答2[2]=“Warsav”;
答复2[3]=“奥斯陆”;
答复2[4]=“赫尔辛基”;
答复3[0]=“地拉那”;
答复3[1]=“萨格勒布”;
答复3[2]=“维尔纽斯”;
答复3[3]=“斯德哥尔摩”;
答复3[4]=“图尔库”;
选择1.setText(答案1[0]);
选择2.setText(回答2[0]);
选择3.setText(答案3[0]);
选项1.设置切换组(答案);
选择2.设置切换组(答案);
选项3.设置切换组(答案);
答案:设置最大宽度(双倍最大值);
设置动作(e->QuestionResponsed());
answers.selectedToggleProperty().addListener(新的ChangeListener()){
@凌驾
public void changed(observeValue这类任务提供了一个OOP和MVC原则的经典示例。正如@UlukBiy所指出的,您甚至在解释中提到了潜在的对象类(eq问题
/答案
),这些类将构成您的模型
到目前为止,您所拥有的大部分内容都以用户界面(视图)为中心
第三个组件是控制器(命名为类似于QuizController
)。这将管理题库(类似于List questions
),并且是nextQuestion()
等方法所在的位置
可能值得注意的是,随着问题/答案数量的增加,您可能会使用一些外部数据源(数据库/xml文件)-但似乎在这里对问题进行硬编码就足够了(可能是控制器中的一些populateQuestionBank()
方法?)
有关MVC模式的更多信息:
这就是为什么会发明for循环的原因:在需要OOP方法之前。如果您注意到,根据您自己的解释,您应该开始创建的第一个类是QuizQuestion
,它有question
,4answer
和correctAnswerNum
字段和构造函数。然后您可以将其设置为QuizQuestion qq=新的QuizQuestion(“问题?”,“答案-1”,“答案-2”,“答案-3”,“答案-4”,3)
其中3表示正确答案是第三个。谢谢您的建议!我是否理解正确,在这种情况下,我将在第三类中创建实际的QuizQuestion对象,在GUI中获取下一个问题并评估用户答案的方法也应在第三类中?是的,您可以创建QuizController(QuizManager)课堂,正如@mixmastered在他的回答中所说的。谢谢你们的回答,我希望我能让这些方法发挥作用。是的,我会有更多的问题,最终我会从一个文件中读取数据,我只是想先让它看起来像一个普通的程序。