implemented a part of the test
This commit is contained in:
parent
6f4d8adf18
commit
7bb22fccd9
@ -7,8 +7,13 @@ import javafx.scene.control.Alert;
|
|||||||
import javafx.scene.control.ButtonType;
|
import javafx.scene.control.ButtonType;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import javafx.event.ActionEvent;
|
import javafx.event.ActionEvent;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public class Utils {
|
public class Utils {
|
||||||
@ -20,9 +25,10 @@ public class Utils {
|
|||||||
stage.show();
|
stage.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Stage getStageFromActionEven(ActionEvent actionEvent){
|
public static Stage getStageFromActionEven(ActionEvent actionEvent) {
|
||||||
return (Stage) ((javafx.scene.Node) actionEvent.getSource()).getScene().getWindow();
|
return (Stage) ((javafx.scene.Node) actionEvent.getSource()).getScene().getWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean showConfirmationButton(String content) {
|
public static boolean showConfirmationButton(String content) {
|
||||||
|
|
||||||
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
|
||||||
@ -39,4 +45,12 @@ public class Utils {
|
|||||||
|
|
||||||
return result.filter(buttonType -> buttonType == yesButton).isPresent();
|
return result.filter(buttonType -> buttonType == yesButton).isPresent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static <T> List<T> getRandom(List<T> items, int count) {
|
||||||
|
// Shuffle the list
|
||||||
|
Collections.shuffle(items);
|
||||||
|
// Return the first 'count' items
|
||||||
|
return items.subList(0, Math.min(count, items.size()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,6 +4,7 @@ import at.ionas999.questioncatalog.Utils;
|
|||||||
import javafx.event.ActionEvent;
|
import javafx.event.ActionEvent;
|
||||||
import javafx.fxml.FXML;
|
import javafx.fxml.FXML;
|
||||||
import javafx.stage.Stage;
|
import javafx.stage.Stage;
|
||||||
|
import javafx.stage.StageStyle;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@ -25,4 +26,10 @@ public class MainController {
|
|||||||
Stage stage = Utils.getStageFromActionEven(actionEvent);
|
Stage stage = Utils.getStageFromActionEven(actionEvent);
|
||||||
Utils.switchScenes("answerText.fxml", stage);
|
Utils.switchScenes("answerText.fxml", stage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void testBtnClick(ActionEvent actionEvent) throws IOException {
|
||||||
|
Stage stage = Utils.getStageFromActionEven(actionEvent);
|
||||||
|
Utils.switchScenes("test.fxml", stage);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,116 @@
|
|||||||
|
package at.ionas999.questioncatalog.controller;
|
||||||
|
|
||||||
|
import at.ionas999.questioncatalog.Utils;
|
||||||
|
import at.ionas999.questioncatalog.model.Question;
|
||||||
|
import at.ionas999.questioncatalog.model.QuestionCatalog;
|
||||||
|
import at.ionas999.questioncatalog.services.QuestionCatalogService;
|
||||||
|
import at.ionas999.questioncatalog.services.QuestionService;
|
||||||
|
import javafx.beans.binding.Bindings;
|
||||||
|
import javafx.beans.property.BooleanProperty;
|
||||||
|
import javafx.beans.property.SimpleBooleanProperty;
|
||||||
|
import javafx.collections.FXCollections;
|
||||||
|
import javafx.collections.ObservableList;
|
||||||
|
import javafx.event.ActionEvent;
|
||||||
|
import javafx.fxml.FXML;
|
||||||
|
import javafx.scene.control.*;
|
||||||
|
import javafx.util.converter.NumberStringConverter;
|
||||||
|
|
||||||
|
import java.lang.reflect.Array;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class TestController {
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private Button nextQuestionBtn;
|
||||||
|
@FXML
|
||||||
|
private Button startBtn;
|
||||||
|
@FXML
|
||||||
|
private ComboBox catalogComboBox;
|
||||||
|
@FXML
|
||||||
|
private TextField questionCountField;
|
||||||
|
@FXML
|
||||||
|
private Slider questionSlider;
|
||||||
|
@FXML
|
||||||
|
private Label questionLabel;
|
||||||
|
@FXML
|
||||||
|
private TextArea userAnswerArea;
|
||||||
|
@FXML
|
||||||
|
private TextArea correctAnswerArea;
|
||||||
|
@FXML
|
||||||
|
private Button correctBtn;
|
||||||
|
@FXML
|
||||||
|
private Button incorrectBtn;
|
||||||
|
|
||||||
|
private BooleanProperty isInCorrectionState = new SimpleBooleanProperty(false);
|
||||||
|
private BooleanProperty isInConfiguringState = new SimpleBooleanProperty(true);
|
||||||
|
|
||||||
|
private ObservableList<QuestionCatalog> catalogs;
|
||||||
|
private ObservableList<Question> questions;
|
||||||
|
private ArrayList<String> answers = new ArrayList<>();
|
||||||
|
private int currentIdx = 0;
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void initialize() throws SQLException {
|
||||||
|
catalogs = FXCollections.observableList(QuestionCatalogService.GetCatalogsWithoutQuestions());
|
||||||
|
catalogComboBox.setItems(catalogs);
|
||||||
|
correctAnswerArea.visibleProperty().bind(isInCorrectionState);
|
||||||
|
correctBtn.visibleProperty().bind(isInCorrectionState);
|
||||||
|
incorrectBtn.visibleProperty().bind(isInCorrectionState);
|
||||||
|
userAnswerArea.editableProperty().bind(isInCorrectionState.not());
|
||||||
|
questionSlider.disableProperty().bind(isInConfiguringState.not());
|
||||||
|
questionCountField.disableProperty().bind(isInConfiguringState.not());
|
||||||
|
catalogComboBox.disableProperty().bind(isInConfiguringState.not());
|
||||||
|
startBtn.textProperty().bind(Bindings.when(isInConfiguringState).then("Start").otherwise("Cancle"));
|
||||||
|
nextQuestionBtn.disableProperty().bind(isInConfiguringState);
|
||||||
|
nextQuestionBtn.visibleProperty().bind(isInCorrectionState.not());
|
||||||
|
|
||||||
|
Bindings.bindBidirectional(questionCountField.textProperty(), questionSlider.valueProperty(), new NumberStringConverter());
|
||||||
|
|
||||||
|
questionSlider.setBlockIncrement(1);
|
||||||
|
questionSlider.valueProperty().addListener((_, _, newValue) -> {
|
||||||
|
questionSlider.setValue(newValue.intValue());
|
||||||
|
});
|
||||||
|
|
||||||
|
catalogComboBox.valueProperty().addListener((_,_,newValue) -> {
|
||||||
|
if(newValue == null)
|
||||||
|
return;
|
||||||
|
QuestionCatalog c = (QuestionCatalog) newValue;
|
||||||
|
try {
|
||||||
|
this.questionSlider.setMax(QuestionCatalogService.GetAmountOfQuestionsFromCatalog(c.getId()));
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void onCorrectBtnClick(ActionEvent actionEvent) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@FXML
|
||||||
|
private void onIncorrectBtnClick(ActionEvent actionEvent) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStartTestBtnClick(ActionEvent actionEvent) throws SQLException {
|
||||||
|
this.isInConfiguringState.setValue(false);
|
||||||
|
ArrayList<Question> questions = QuestionService
|
||||||
|
.GetQuestionsFromCatalog(((QuestionCatalog) catalogComboBox.getValue()).getId());
|
||||||
|
this.questions = FXCollections.observableList(Utils.getRandom(questions, (int) this.questionSlider.getValue()));
|
||||||
|
this.questionLabel.setText(this.questions.get(currentIdx).getQuestion());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showNextQuestion(ActionEvent actionEvent) {
|
||||||
|
this.answers.add(this.userAnswerArea.getText());
|
||||||
|
currentIdx++;
|
||||||
|
if(currentIdx >= this.questions.size())
|
||||||
|
{
|
||||||
|
this.isInCorrectionState.setValue(true);
|
||||||
|
this.questionLabel.setText("Rate your Answers !");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.userAnswerArea.clear();
|
||||||
|
this.questionLabel.setText(this.questions.get(currentIdx).getQuestion());
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -67,6 +67,23 @@ public class QuestionCatalogService {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static int GetAmountOfQuestionsFromCatalog(int id) throws SQLException {
|
||||||
|
String stmtString = "SELECT COUNT(*) FROM QUESTION WHERE QUESTIONCATALOGID = ?";
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
|
try (Connection connection = ServiceBase.GetJDBCConnection()) {
|
||||||
|
try (PreparedStatement statement = connection.prepareStatement(stmtString)) {
|
||||||
|
statement.setInt(1, id);
|
||||||
|
ResultSet rs = statement.executeQuery();
|
||||||
|
if (rs.next()) {
|
||||||
|
count = rs.getInt(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
public static ArrayList<QuestionCatalog> GetCatalogsWithoutQuestions() throws SQLException {
|
public static ArrayList<QuestionCatalog> GetCatalogsWithoutQuestions() throws SQLException {
|
||||||
String stmtString = "select id, name from QUESTIONCATALOG";
|
String stmtString = "select id, name from QUESTIONCATALOG";
|
||||||
|
|
||||||
|
|||||||
@ -13,5 +13,6 @@
|
|||||||
<Button text="Add New" onAction="#addNewBtnClick" prefWidth="150" />
|
<Button text="Add New" onAction="#addNewBtnClick" prefWidth="150" />
|
||||||
<Button text="View" onAction="#viewBtnClick" prefWidth="149" />
|
<Button text="View" onAction="#viewBtnClick" prefWidth="149" />
|
||||||
<Button text="Learn" onAction="#learnBtnClick" prefWidth="150" />
|
<Button text="Learn" onAction="#learnBtnClick" prefWidth="150" />
|
||||||
|
<Button text="Test" onAction="#testBtnClick" prefWidth="150" />
|
||||||
</VBox>
|
</VBox>
|
||||||
</VBox>
|
</VBox>
|
||||||
45
src/main/resources/at/ionas999/questioncatalog/test.fxml
Normal file
45
src/main/resources/at/ionas999/questioncatalog/test.fxml
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<?import javafx.scene.control.*?>
|
||||||
|
<?import javafx.scene.layout.*?>
|
||||||
|
|
||||||
|
<AnchorPane xmlns="http://javafx.com/javafx"
|
||||||
|
xmlns:fx="http://javafx.com/fxml"
|
||||||
|
prefWidth="600.0" prefHeight="400.0"
|
||||||
|
fx:controller="at.ionas999.questioncatalog.controller.TestController">
|
||||||
|
<children>
|
||||||
|
<VBox spacing="20" alignment="CENTER" AnchorPane.topAnchor="10.0" AnchorPane.leftAnchor="10.0"
|
||||||
|
AnchorPane.rightAnchor="10.0">
|
||||||
|
<!-- Start Test Button -->
|
||||||
|
<Button text="Start Test" fx:id="startBtn" onAction="#onStartTestBtnClick"/>
|
||||||
|
<!-- Slider and Input Box -->
|
||||||
|
<HBox spacing="10" alignment="CENTER">
|
||||||
|
<Label text="Number of Questions:"/>
|
||||||
|
<TextField fx:id="questionCountField" promptText="Enter amount"/>
|
||||||
|
<Slider fx:id="questionSlider" min="1" max="10" showTickLabels="true" showTickMarks="true"/>
|
||||||
|
<ComboBox fx:id="catalogComboBox" promptText="Choose a catalog" />
|
||||||
|
</HBox>
|
||||||
|
|
||||||
|
<!-- Question Display -->
|
||||||
|
<Label fx:id="questionLabel" text="Question will appear here" style="-fx-font-size: 18;"/>
|
||||||
|
|
||||||
|
<!-- User Input Box -->
|
||||||
|
<TextArea fx:id="userAnswerArea" promptText="Enter your answer here..." wrapText="true" prefHeight="100.0"
|
||||||
|
prefWidth="300.0"/>
|
||||||
|
|
||||||
|
<Button text="Next Question" fx:id="nextQuestionBtn" onAction="#showNextQuestion"/>
|
||||||
|
|
||||||
|
<!-- Correct Answer Display -->
|
||||||
|
<VBox spacing="10" alignment="CENTER">
|
||||||
|
<Label text="Correct Answer:" style="-fx-font-size: 14;"/>
|
||||||
|
<TextArea fx:id="correctAnswerArea" editable="false" wrapText="true" prefHeight="100.0"
|
||||||
|
prefWidth="300.0"/>
|
||||||
|
</VBox>
|
||||||
|
|
||||||
|
<!-- Correct and Incorrect Buttons -->
|
||||||
|
<HBox spacing="10" alignment="CENTER">
|
||||||
|
<Button text="Correct" fx:id="correctBtn" onAction="#onCorrectBtnClick"/>
|
||||||
|
<Button text="Incorrect" fx:id="incorrectBtn" onAction="#onIncorrectBtnClick"/>
|
||||||
|
</HBox>
|
||||||
|
</VBox>
|
||||||
|
</children>
|
||||||
|
</AnchorPane>
|
||||||
Loading…
Reference in New Issue
Block a user