NetBeans项目

一个创建和参加测验的系统

下一个例子是一个向一组学生提供选择题的系统。该系统将由三个赢博体育程序组成:

这三个赢博体育程序都将与同一个数据库交互。

我将为第一个和第三个赢博体育程序编写代码。您将编写第二个赢博体育程序的代码,作为您的下一个家庭作业。

测验写作赢博体育程序

第一个赢博体育程序是用于创建测验和测验问题的赢博体育程序。

该赢博体育程序由一个窗口和一个对话框组成。

在窗口的顶部有一个菜单栏,其中包含文件和测验菜单。“文件”菜单只有一个项目,即“退出”命令。Quizzes菜单包含两个项,一个用于制作新测验,另一个用于从数据库中删除当前选择的测验。

菜单栏下面是一个显示测验标题列表的选择框。当用户从ChoiceBox中选择测验时,赢博体育程序将在列表视图中显示该特定测验的问题。

在ListView下面有三个按钮,用于生成新问题、编辑现有问题或删除所选问题。单击New或Edit按钮将弹出一个对话框,用户可以使用该对话框输入问题的详细信息。

赢博体育的测试问题都是选择题,有四个可能的答案。我们将以逗号分隔的选项列表输入四个可能的选项。在设置问题时,我们也会用字母a到d来记录哪个选项是正确的。

赢博体育程序如何工作

由于这个赢博体育程序使用了我在Hotel示例中已经演示过的许多想法,因此我将在这里把评论限制在我希望引起您注意的一些特殊功能上。

第一个特殊功能是ChoiceBox,它显示系统中的测验列表。

初始化ChoiceBox的代码出现在主窗口控制器的initialize方法中。

@Override public void initialize(URL URL, ResourceBundle rb) {dao = new QuizDAO();ArrayList<String> quizNames = dao.getQuizNames();字符串quiz = quizNames.get(0);quizChoice.getItems () .addAll (quizNames);quizChoice.setValue(测试);.selectedItemProperty quizChoice.getSelectionModel()()。addListener((observable, oldValue, newValue)-> changequz (newValue));dao.setQuiz(测试);subjectsList.setItems (dao.getSubjects ());}

这里发生的一件重要的事情是我附加到ChoiceBox上的更改侦听器。每当用户从列表中选择一个新的测验时,我们将调用changeQuiz()方法来适当地更新内容:

private void changeQuiz(对象quiz) {if(quiz != null) dao.setQuiz(quiz. tostring ());}

这个方法依次调用DAO类中的一个方法来更改当前选择的测验:

private String subjectsSQL = "select id, subject from where quiz=?";private PreparedStatement subjtsstmt;private PreparedStatement questionStmt私有字符串quizIDSQL = "select id from quizzes where title=?";private PreparedStatement quizIDStmt;公共无效setQuiz(String quizName){尝试{quizIDStmt。quizName setString(1日);ResultSet result = quizIDStmt.executeQuery();if(result.next()) {currentQuiz = result.getInt(1);} else currentQuiz = 0;}catch (SQLException ex) {currentQuiz = 0;ex.printStackTrace ();} if(currentQuiz == 0) return;rebuildSubjects ();}公共无效rebuildSubjects() {subjects.clear();try {subjectstmt .}currentQuiz setInt(1日);ResultSet ResultSet = subjectstmt . executequery ();while (resultSet.next()) {int id = resultSet.getInt("id");String subject = resultSet.getString("subject");科目。添加(新的主题(id、主题));}} catch (SQLException ex) {ex. printstacktrace ();}}

另一个需要注意的特殊功能是链接到Quizzes菜单中用于制作新测验的项目的代码。作为制作新测验过程的一部分,我们需要要求用户为测验输入一个名称。为了处理这个问题,我们使用JavaFX提供的预构建对话框,TextInputDialog。

@FXML private void newQuiz(ActionEvent event) {texttinputdialog对话框= new texttinputdialog ();dialog.setHeaderText(空);dialog.setGraphic(空);对话框。setTitle(“新测试”);对话框。setContentText(“输入测验名称”);可选<String> result = dialog.showAndWait();if (result.isPresent()){字符串quiz = result.get();dao.addQuiz(测试);.clear quizChoice.getItems () ();ArrayList<String> quizNames = dao.getQuizNames();quizChoice.getItems () .addAll (quizNames);quizChoice.setValue(测试);dao.setQuiz(测试);}}

为了使用TextInputDialog,我们为对话框设置了一些选项,比如它的标题和我们正在询问的问题的提示,然后调用showAndWait()方法来显示对话框。结果对话框看起来像这样:

texttinputdialog将返回一个字符串给我们,其中包含用户输入的文本。一个复杂的问题是,用户可以选择取消对话框,不提供答案。为了覆盖这种情况,TextInputDialog的showAndWait()方法返回一个特殊的Optional 对象。我们可以通过调用可选对象的isPresent()方法询问该对象是否用户提供了答案。如果这个问题的答案是“是”,我们可以通过调用可选的get()方法获得用户输入的实际字符串。