Search in sources :

Example 76 with ObservableList

use of javafx.collections.ObservableList in project jgnash by ccavanaugh.

the class IncomeExpensePayeePieChartDialogController method createPieDataSet.

private ObservableList<PieChart.Data>[] createPieDataSet(@NotNull final Account account) {
    @SuppressWarnings("unchecked") final ObservableList<PieChart.Data>[] chartData = new ObservableList[2];
    chartData[CREDIT] = FXCollections.observableArrayList();
    chartData[DEBIT] = FXCollections.observableArrayList();
    final Map<String, BigDecimal> names = new HashMap<>();
    final List<TranTuple> list = getTransactions(account, new ArrayList<>(), startDatePicker.getValue(), endDatePicker.getValue());
    final CurrencyNode currency = account.getCurrencyNode();
    // Create a list of predicates
    final List<Predicate<Transaction>> predicates = getPayeeTextFields().stream().filter(textField -> !textField.getText().isEmpty()).map(textField -> new PayeePredicate(textField.getText(), Options.regexForFiltersProperty().get())).collect(Collectors.toList());
    // Iterate through the list and add up filtered payees
    for (final TranTuple tranTuple : list) {
        final String payee = tranTuple.transaction.getPayee();
        BigDecimal sum = tranTuple.transaction.getAmount(tranTuple.account);
        sum = sum.multiply(tranTuple.account.getCurrencyNode().getExchangeRate(currency));
        boolean keep = false;
        if (predicates.isEmpty()) {
            keep = true;
        } else {
            for (final Predicate<Transaction> predicate : predicates) {
                if (predicate.test(tranTuple.transaction)) {
                    keep = true;
                    break;
                }
            }
        }
        if (keep) {
            if (names.containsKey(payee)) {
                sum = sum.add(names.get(payee));
            }
            names.put(payee, sum);
        }
    }
    final Map<String, BigDecimal> sortedNames = CollectionUtils.sortMapByValue(names);
    for (final Map.Entry<String, BigDecimal> entry : sortedNames.entrySet()) {
        final PieChart.Data data = new PieChart.Data(truncateString(entry.getKey()), entry.getValue().abs().doubleValue());
        // nodes are created lazily.  Set the user data (Account) after the node is created
        data.nodeProperty().addListener((observable, oldValue, newValue) -> newValue.setUserData(entry.getKey()));
        if (entry.getValue().signum() == -1) {
            chartData[DEBIT].add(data);
        } else {
            chartData[CREDIT].add(data);
        }
    }
    return chartData;
}
Also used : CurrencyNode(jgnash.engine.CurrencyNode) DoughnutChart(jgnash.uifx.control.DoughnutChart) Scene(javafx.scene.Scene) Engine(jgnash.engine.Engine) TextInputControl(javafx.scene.control.TextInputControl) Transaction(jgnash.engine.Transaction) EngineFactory(jgnash.engine.EngineFactory) FXCollections(javafx.collections.FXCollections) HashMap(java.util.HashMap) VBox(javafx.scene.layout.VBox) Side(javafx.geometry.Side) AccountComboBox(jgnash.uifx.control.AccountComboBox) NumberFormat(java.text.NumberFormat) ArrayList(java.util.ArrayList) EncodeDecode(jgnash.util.EncodeDecode) BigDecimal(java.math.BigDecimal) ResourceBundle(java.util.ResourceBundle) Map(java.util.Map) Tooltip(javafx.scene.control.Tooltip) GridPane(javafx.scene.layout.GridPane) CurrencyNode(jgnash.engine.CurrencyNode) ObjectProperty(javafx.beans.property.ObjectProperty) TextField(javafx.scene.control.TextField) InjectFXML(jgnash.uifx.util.InjectFXML) TitledPane(javafx.scene.control.TitledPane) NotNull(jgnash.util.NotNull) Comparators(jgnash.engine.Comparators) Predicate(java.util.function.Predicate) UUID(java.util.UUID) Collectors(java.util.stream.Collectors) JavaFXUtils(jgnash.uifx.util.JavaFXUtils) Preferences(java.util.prefs.Preferences) Objects(java.util.Objects) FXML(javafx.fxml.FXML) PieChart(javafx.scene.chart.PieChart) List(java.util.List) Stage(javafx.stage.Stage) SimpleObjectProperty(javafx.beans.property.SimpleObjectProperty) LocalDate(java.time.LocalDate) Account(jgnash.engine.Account) ObservableList(javafx.collections.ObservableList) PayeePredicate(jgnash.util.function.PayeePredicate) ChangeListener(javafx.beans.value.ChangeListener) Collections(java.util.Collections) NumericFormats(jgnash.text.NumericFormats) DatePickerEx(jgnash.uifx.control.DatePickerEx) CollectionUtils(jgnash.util.CollectionUtils) Options(jgnash.uifx.Options) HashMap(java.util.HashMap) BigDecimal(java.math.BigDecimal) Predicate(java.util.function.Predicate) PayeePredicate(jgnash.util.function.PayeePredicate) PieChart(javafx.scene.chart.PieChart) Transaction(jgnash.engine.Transaction) ObservableList(javafx.collections.ObservableList) PayeePredicate(jgnash.util.function.PayeePredicate) HashMap(java.util.HashMap) Map(java.util.Map)

Example 77 with ObservableList

use of javafx.collections.ObservableList in project Minesweeper3D by SethDamiani.

the class Main method start.

@Override
public void start(Stage primaryStage) throws Exception {
    // Main JavaFX method
    // Add all sides into the cube group
    cube.getChildren().addAll(sideA, sideB, sideC, sideD, sideE, sideF);
    // Set proper layout
    cube.setLayoutX(150);
    cube.setLayoutY(190);
    // Create the main cube object
    createCube(cube, gX, gY, game, primaryStage);
    // Properly nest cube rotation control groups
    gameRoot.getChildren().add(gY);
    // ||
    gY.getChildren().add(gX);
    // ||
    gX.getChildren().add(cube);
    stopwatch.setFont(new Font(45));
    bombs.setFont(new Font(45));
    gameRoot.getChildren().addAll(stopwatch, bombs);
    timeTask = new Timeline(new KeyFrame(Duration.seconds(1), event -> {
        // Task to keep track of time
        time++;
        stopwatch.setText("Time: " + String.valueOf(time));
    }));
    // Make timeTask run forever and ever
    timeTask.setCycleCount(Timeline.INDEFINITE);
    for (int x = 0; x < Grid.length; x++) {
        // Add the cells to their proper side groups
        for (int y = 0; y < Grid[x].length; y++) {
            for (int z = 0; z < Grid[x][y].length; z++) {
                Grid[x][y][z] = new Cell(cube, 40, 40 * y, 40 * z, x);
                switch(x) {
                    case 0:
                        sideA.getChildren().add(Grid[x][y][z].cell);
                        break;
                    case 1:
                        sideB.getChildren().add(Grid[x][y][z].cell);
                        break;
                    case 2:
                        sideC.getChildren().add(Grid[x][y][z].cell);
                        break;
                    case 3:
                        sideD.getChildren().add(Grid[x][y][z].cell);
                        break;
                    case 4:
                        sideE.getChildren().add(Grid[x][y][z].cell);
                        break;
                    case 5:
                        sideF.getChildren().add(Grid[x][y][z].cell);
                        break;
                }
            }
        }
    }
    // Place bombs randomly
    placeBombs(100);
    // Place the correct numbers according to the new bomb positions
    placeNumbers();
    // -------------------------------------------------------------------------------
    // Confirm Exit screen setup
    // new Color(1,1,1,.5)
    Text confirmExitText = new Text("Quit");
    confirmExitText.setFill(Color.WHITE);
    confirmExitText.setFont(Font.font(80));
    confirmExitText.setX(400 - confirmExitText.getLayoutBounds().getWidth() / 2);
    confirmExitText.setY(200);
    Text confirmExitSubText = new Text("Are you sure you would like to quit to the main menu?\nAll progress will be lost.");
    confirmExitSubText.setFill(Color.WHITE);
    confirmExitSubText.setFont(Font.font(20));
    confirmExitSubText.setTextAlignment(TextAlignment.CENTER);
    confirmExitSubText.setX(400 - confirmExitSubText.getLayoutBounds().getWidth() / 2);
    confirmExitSubText.setY(300);
    Text confirmExitYesText = new Text("Yes");
    confirmExitYesText.setFont(Font.font(30));
    confirmExitYesText.setFill(Color.WHITE);
    confirmExitYesText.setX(300 - confirmExitYesText.getLayoutBounds().getWidth() / 2);
    confirmExitYesText.setY(500);
    Rectangle confirmExitYesButton = new Rectangle(confirmExitYesText.getBoundsInLocal().getMinX() - 20, confirmExitYesText.getBoundsInLocal().getMinY() - 20, confirmExitYesText.getLayoutBounds().getWidth() + 40, confirmExitYesText.getLayoutBounds().getHeight() + 40);
    confirmExitYesButton.setFill(Color.TRANSPARENT);
    confirmExitYesButton.setStroke(Color.WHITE);
    confirmExitYesButton.setStrokeWidth(10);
    confirmExitYesButton.setOnMouseEntered(event -> confirmExitYesButton.setFill(new Color(1, 1, 1, .5)));
    confirmExitYesButton.setOnMouseExited(event -> confirmExitYesButton.setFill(Color.TRANSPARENT));
    confirmExitYesText.setOnMouseEntered(event -> confirmExitYesButton.setFill(new Color(1, 1, 1, .5)));
    confirmExitYesText.setOnMouseExited(event -> confirmExitYesButton.setFill(Color.TRANSPARENT));
    confirmExitYesButton.setOnMouseClicked(event -> primaryStage.setScene(menu));
    confirmExitYesText.setOnMouseClicked(event -> primaryStage.setScene(menu));
    Text confirmExitNoText = new Text("No");
    confirmExitNoText.setFont(Font.font(30));
    confirmExitNoText.setFill(Color.WHITE);
    confirmExitNoText.setX(500 - confirmExitYesText.getLayoutBounds().getWidth() / 2);
    confirmExitNoText.setY(500);
    Rectangle confirmExitNoButton = new Rectangle(confirmExitNoText.getBoundsInLocal().getMinX() - 20, confirmExitNoText.getBoundsInLocal().getMinY() - 20, confirmExitNoText.getLayoutBounds().getWidth() + 40, confirmExitNoText.getLayoutBounds().getHeight() + 40);
    confirmExitNoButton.setFill(Color.TRANSPARENT);
    confirmExitNoButton.setStroke(Color.WHITE);
    confirmExitNoButton.setStrokeWidth(10);
    confirmExitNoButton.setOnMouseEntered(event -> confirmExitNoButton.setFill(new Color(1, 1, 1, .5)));
    confirmExitNoButton.setOnMouseExited(event -> confirmExitNoButton.setFill(Color.TRANSPARENT));
    confirmExitNoText.setOnMouseEntered(event -> confirmExitNoButton.setFill(new Color(1, 1, 1, .5)));
    confirmExitNoText.setOnMouseExited(event -> confirmExitNoButton.setFill(Color.TRANSPARENT));
    confirmExitNoButton.setOnMouseClicked(event -> {
        timeTask.play();
        primaryStage.setScene(game);
    });
    confirmExitNoText.setOnMouseClicked(event -> {
        timeTask.play();
        primaryStage.setScene(game);
    });
    confirmExitRoot.getChildren().addAll(confirmExitText, confirmExitSubText, confirmExitYesText, confirmExitNoText, confirmExitYesButton, confirmExitNoButton);
    // Quit screen UI setup
    // Initialize and configure background
    Rectangle quitBox = new Rectangle(800, 700, Color.INDIANRED);
    // Initialize and configure the title
    Text quitText = new Text(260, 200, "Game Over");
    quitText.setFont(new Font(80));
    quitText.setStroke(Color.WHITE);
    quitText.setFill(Color.WHITE);
    quitText.setTextAlignment(TextAlignment.CENTER);
    quitText.setX(400 - quitText.getLayoutBounds().getWidth() / 2);
    // Initialize and configure the time text
    Text endScoreText = new Text(260, 320, "Time: ");
    endScoreText.setFont(new Font(40));
    endScoreText.setTextAlignment(TextAlignment.CENTER);
    endScoreText.setFill(Color.WHITE);
    endScoreText.setStroke(Color.WHITE);
    // Center the text within the button
    endScoreText.setX(350 - endScoreText.getLayoutBounds().getWidth() / 2);
    // Initialize and configure first name input field
    TextField firstNameInput = new TextField();
    firstNameInput.setFont(new Font(24));
    // Initialize and configure first name input label
    Text firstNameLabel = new Text("First name: ");
    firstNameLabel.setFont(new Font(28));
    firstNameLabel.setFill(Color.WHITE);
    // Initialize and configure horizontal box for first name input
    HBox firstNameBox = new HBox(5, firstNameLabel, firstNameInput);
    firstNameBox.setLayoutX(180);
    firstNameBox.setLayoutY(395);
    // Initialize and configure last name input field
    TextField lastNameInput = new TextField();
    lastNameInput.setFont(new Font(24));
    // Initialize and configure last name input label
    Text lastNameLabel = new Text("Last name: ");
    lastNameLabel.setFont(new Font(28));
    lastNameLabel.setFill(Color.WHITE);
    // Initialize and configure horizontal box for last name input
    HBox lastNameBox = new HBox(5, lastNameLabel, lastNameInput);
    lastNameBox.setLayoutX(182);
    lastNameBox.setLayoutY(450);
    // Initialize and configure continue button border
    Rectangle continueRect = new Rectangle(300, 550, 500, 70);
    continueRect.setStroke(Color.WHITE);
    continueRect.setFill(Color.TRANSPARENT);
    continueRect.setStrokeWidth(5);
    // Initialize and configure continue button text
    Text continueText = new Text("Submit and Continue");
    continueText.setFont(new Font(50));
    continueText.setFill(Color.WHITE);
    continueText.setY(600);
    continueText.setX(400 - continueText.getLayoutBounds().getWidth() / 2);
    continueRect.setWidth(continueText.getLayoutBounds().getWidth() + 40);
    continueRect.setX(400 - continueRect.getLayoutBounds().getWidth() / 2);
    // Advance to next field on enter press
    firstNameInput.setOnAction(event -> lastNameInput.requestFocus());
    game.addEventHandler(KeyEvent.KEY_PRESSED, event -> {
        // Manual game-win override
        if (event.getCode() == KeyCode.BACK_SLASH && event.isAltDown()) {
            gameWon = true;
            endScoreText.setText("Time: " + time);
            endScoreText.setX(400 - endScoreText.getLayoutBounds().getWidth() / 2);
            game.getOnMouseClicked().handle(mouseEvent);
        }
    });
    lastNameInput.setOnAction(event -> {
        // Submit score when enter is pressed in last name entry
        if (gameWon) {
            String firstName = firstNameInput.getText();
            String lastName = lastNameInput.getText();
            Long date = System.currentTimeMillis() / 1000;
            highScoresMap.put(date, new HighScore(date, difficulty, firstName, lastName, time));
            refreshTableData();
            try {
                writeHighScores();
            } catch (IOException e) {
                System.out.println("ERROR: couldn't save high scores to file.");
            }
        }
        primaryStage.setScene(menu);
    });
    quitRoot.getChildren().addAll(quitBox, quitText, endScoreText, firstNameBox, lastNameBox, continueRect, continueText);
    EventHandler<MouseEvent> submitScores = event -> {
        // Process new high score data into table and .csv
        if (gameWon) {
            String firstName = firstNameInput.getText();
            String lastName = lastNameInput.getText();
            Long date = System.currentTimeMillis() / 1000;
            highScoresMap.put(date, new HighScore(date, difficulty, firstName, lastName, time));
            refreshTableData();
            try {
                writeHighScores();
            } catch (IOException e) {
                System.out.println("ERROR: couldn't save high scores to file.");
            }
        }
        primaryStage.setScene(menu);
    };
    continueRect.addEventHandler(MouseEvent.MOUSE_CLICKED, submitScores);
    continueText.addEventHandler(MouseEvent.MOUSE_CLICKED, submitScores);
    // Pause screen UI setup
    Rectangle pauseBox = new Rectangle(800, 700, Color.BLACK);
    Text pauseText = new Text(260, 350, "Paused");
    pauseText.setFont(new Font(80));
    pauseText.setStroke(Color.WHITE);
    pauseText.setFill(Color.WHITE);
    pauseText.setTextAlignment(TextAlignment.CENTER);
    Text timeText = new Text(260, 430, "Time: ");
    timeText.setFont(new Font(40));
    timeText.setTextAlignment(TextAlignment.CENTER);
    timeText.setFill(Color.WHITE);
    timeText.setStroke(Color.WHITE);
    timeText.setX(250 - timeText.getLayoutBounds().getWidth() / 2);
    Text bombsText = new Text(550, 430, bombs.getText());
    bombsText.setFont(new Font(40));
    bombsText.setTextAlignment(TextAlignment.CENTER);
    bombsText.setFill(Color.WHITE);
    bombsText.setStroke(Color.WHITE);
    bombsText.setX(500 - bombsText.getLayoutBounds().getWidth() / 2);
    Text infoText = new Text("Loading");
    infoText.setFont(new Font(40));
    infoText.setTextAlignment(TextAlignment.CENTER);
    infoText.setFill(Color.WHITE);
    infoText.setStroke(Color.WHITE);
    infoText.setX(400 - infoText.getLayoutBounds().getWidth() / 2);
    infoText.setY(430);
    Rectangle resume = new Rectangle(300, 500, 200, 70);
    resume.setFill(Color.TRANSPARENT);
    resume.setStroke(Color.WHITE);
    resume.setStrokeWidth(5);
    Text resumeText = new Text("Resume");
    resumeText.setFont(new Font(50));
    resumeText.setFill(Color.WHITE);
    resumeText.setY(550);
    resumeText.setX(400 - resumeText.getLayoutBounds().getWidth() / 2);
    pauseRoot.getChildren().addAll(pauseBox, pauseText, resume, resumeText, infoText);
    EventHandler<MouseEvent> resumeButton = event -> {
        timeTask.play();
        primaryStage.setScene(game);
    };
    resume.addEventHandler(MouseEvent.MOUSE_CLICKED, resumeButton);
    resumeText.addEventHandler(MouseEvent.MOUSE_CLICKED, resumeButton);
    pause.setOnKeyPressed(event -> {
        if (event.getCode() == KeyCode.SPACE) {
            primaryStage.setScene(game);
            timeTask.play();
        } else if (event.getCode() == KeyCode.ESCAPE) {
            primaryStage.setScene(confirmExit);
        // primaryStage.close();
        }
    });
    game.setOnKeyPressed(event -> {
        if (event.getCode() == KeyCode.SPACE) {
            timeTask.pause();
            infoText.setText("Time: " + time + "s  Bombs: " + flaggedCells + "/" + totalBombs);
            infoText.setX(400 - infoText.getLayoutBounds().getWidth() / 2);
            primaryStage.setScene(pause);
        }
    });
    // High scores UI setup
    scores.setFill(new ImagePattern(bg));
    Text scoresTitle = new Text(120, 120, "High Scores");
    scoresRoot.getChildren().add(scoresTitle);
    scoresTitle.setFont(new Font(70));
    scoresTitle.setStroke(Color.BLACK);
    scoresTitle.setStrokeWidth(5);
    scoresTitle.setTextAlignment(TextAlignment.CENTER);
    scoresTitle.setX(400 - scoresTitle.getLayoutBounds().getWidth() / 2);
    Rectangle back = new Rectangle(100, 550, 200, 70);
    back.setFill(Color.TRANSPARENT);
    back.setStroke(Color.BLACK);
    back.setStrokeWidth(5);
    back.setFill(new Color(1, 1, 1, .5));
    back.setOnMouseEntered(event -> back.setFill(new Color(1, 1, 1, .8)));
    back.setOnMouseExited(event -> back.setFill(new Color(1, 1, 1, .5)));
    scoresRoot.getChildren().add(back);
    Text backText = new Text("Back");
    backText.setFont(new Font(50));
    backText.setFill(Color.BLACK);
    backText.setY(600);
    backText.setX(200 - backText.getLayoutBounds().getWidth() / 2);
    backText.setStroke(Color.BLACK);
    backText.setStrokeWidth(3);
    backText.setOnMouseEntered(event -> back.setFill(new Color(1, 1, 1, .8)));
    backText.setOnMouseExited(event -> back.setFill(new Color(1, 1, 1, .5)));
    scoresRoot.getChildren().add(backText);
    EventHandler<MouseEvent> backButton = event -> primaryStage.setScene(menu);
    back.addEventHandler(MouseEvent.MOUSE_CLICKED, backButton);
    backText.addEventHandler(MouseEvent.MOUSE_CLICKED, backButton);
    Rectangle deleteScore = new Rectangle(500, 550, 200, 70);
    deleteScore.setFill(Color.TRANSPARENT);
    deleteScore.setStroke(Color.BLACK);
    deleteScore.setStrokeWidth(5);
    deleteScore.setFill(new Color(1, 1, 1, .5));
    deleteScore.setOnMouseEntered(event -> deleteScore.setFill(new Color(1, 1, 1, .8)));
    deleteScore.setOnMouseExited(event -> deleteScore.setFill(new Color(1, 1, 1, .5)));
    scoresRoot.getChildren().add(deleteScore);
    Text deleteScoresText = new Text("Delete");
    deleteScoresText.setFont(new Font(50));
    deleteScoresText.setFill(Color.BLACK);
    deleteScoresText.setY(600);
    deleteScoresText.setX(600 - deleteScoresText.getLayoutBounds().getWidth() / 2);
    deleteScoresText.setStroke(Color.BLACK);
    deleteScoresText.setStrokeWidth(3);
    deleteScoresText.setOnMouseEntered(event -> deleteScore.setFill(new Color(1, 1, 1, .8)));
    deleteScoresText.setOnMouseExited(event -> deleteScore.setFill(new Color(1, 1, 1, .5)));
    scoresRoot.getChildren().add(deleteScoresText);
    EventHandler<MouseEvent> deleteScoreButton = event -> {
        // Delete selected high score from table and .csv
        if (table.getSelectionModel().getSelectedIndex() == -1)
            return;
        HighScore current = (HighScore) table.getSelectionModel().getSelectedItem();
        highScoresMap.remove(Long.parseLong(current.getRawID()));
        refreshTableData();
        try {
            writeHighScores();
        } catch (IOException e) {
            System.out.println("ERROR: couldn't save high scores to file.");
        }
    };
    deleteScore.addEventHandler(MouseEvent.MOUSE_CLICKED, deleteScoreButton);
    deleteScoresText.addEventHandler(MouseEvent.MOUSE_CLICKED, deleteScoreButton);
    CheckBox editable = new CheckBox("Edit mode");
    editable.setSelected(true);
    editable.setLayoutX(630);
    editable.setLayoutY(30);
    editable.setFont(Font.font("Tahoma", FontWeight.BLACK, 18));
    scoresRoot.getChildren().add(editable);
    // High scores table setup
    table = new TableView();
    table.setLayoutX(100);
    table.setLayoutY(200);
    table.setPrefWidth(600);
    table.setPrefHeight(300);
    table.setEditable(true);
    EventHandler<TableColumn.CellEditEvent> fieldEditCommit = event -> {
        if (table.getSelectionModel().getSelectedIndex() == -1)
            return;
        HighScore current = (HighScore) table.getSelectionModel().getSelectedItem();
        switch(event.getTableColumn().getId()) {
            case "Difficulty":
                highScoresMap.get(Long.parseLong(current.getRawID())).setDifficulty((String) event.getNewValue());
                break;
            case "First Name":
                highScoresMap.get(Long.parseLong(current.getRawID())).setFirstName((String) event.getNewValue());
                break;
            case "Last Name":
                highScoresMap.get(Long.parseLong(current.getRawID())).setLastName((String) event.getNewValue());
                break;
        }
        try {
            writeHighScores();
        } catch (IOException e) {
            System.out.println("Error saving scores");
        }
        refreshTableData();
    };
    table.setStyle(".list-view .scroll-bar:horizontal .increment-arrow,.list-view .scroll-bar:horizontal .decrement-arrow,.list-view .scroll-bar:horizontal .increment-button,.list-view .scroll-bar:horizontal .decrement-button {-fx-padding:0;}");
    IDCol.setCellValueFactory(new PropertyValueFactory<HighScore, String>("ID"));
    IDCol.prefWidthProperty().bind(table.widthProperty().multiply(0.3));
    IDCol.setId("ID");
    IDCol.setSortable(false);
    IDCol.setResizable(false);
    difficultyCol.setCellValueFactory(new PropertyValueFactory<HighScore, String>("difficulty"));
    difficultyCol.setCellFactory(TextFieldTableCell.forTableColumn());
    difficultyCol.setOnEditCommit(fieldEditCommit);
    difficultyCol.prefWidthProperty().bind(table.widthProperty().multiply(0.175));
    difficultyCol.setId("Difficulty");
    difficultyCol.setSortable(false);
    difficultyCol.setResizable(false);
    firstNameCol.setCellValueFactory(new PropertyValueFactory<HighScore, String>("firstName"));
    firstNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
    firstNameCol.setOnEditCommit(fieldEditCommit);
    firstNameCol.prefWidthProperty().bind(table.widthProperty().multiply(0.175));
    firstNameCol.setId("First Name");
    firstNameCol.setSortable(false);
    firstNameCol.setResizable(false);
    lastNameCol.setCellValueFactory(new PropertyValueFactory<HighScore, String>("lastName"));
    lastNameCol.setCellFactory(TextFieldTableCell.forTableColumn());
    lastNameCol.setOnEditCommit(fieldEditCommit);
    lastNameCol.prefWidthProperty().bind(table.widthProperty().multiply(0.175));
    lastNameCol.setId("Last Name");
    lastNameCol.setSortable(false);
    lastNameCol.setResizable(false);
    timeCol.setCellValueFactory(new PropertyValueFactory<HighScore, String>("time"));
    timeCol.prefWidthProperty().bind(table.widthProperty().multiply(0.172));
    timeCol.setId("Time");
    timeCol.setSortable(true);
    timeCol.setResizable(false);
    table.getSortOrder().setAll(timeCol);
    timeCol.setSortType(TableColumn.SortType.ASCENDING);
    table.getColumns().addAll(IDCol, difficultyCol, firstNameCol, lastNameCol, timeCol);
    table.setOnMousePressed(event -> table.getSortOrder().setAll(timeCol));
    MenuItem tableDelete = new MenuItem("Delete");
    tableDelete.setOnAction(event -> {
        if (table.getSelectionModel().getSelectedIndex() == -1)
            return;
        HighScore current = (HighScore) table.getSelectionModel().getSelectedItem();
        highScoresMap.remove(Long.parseLong(current.getRawID()));
        refreshTableData();
    });
    editable.setOnAction(event -> {
        if (event.getSource() instanceof CheckBox) {
            CheckBox checkBox = (CheckBox) event.getSource();
            if (checkBox.isSelected()) {
                difficultyCol.setEditable(true);
                firstNameCol.setEditable(true);
                lastNameCol.setEditable(true);
            } else {
                difficultyCol.setEditable(false);
                firstNameCol.setEditable(false);
                lastNameCol.setEditable(false);
            }
        }
    });
    // Search abilities setup
    table.setPlaceholder(new Label("Search did not return any results."));
    ObservableList<String> searchOptions = FXCollections.observableArrayList("Date", "Difficulty", "First Name", "Last Name", "Time");
    ComboBox searchSelector = new ComboBox(searchOptions);
    searchSelector.getSelectionModel().select(2);
    searchSelector.setLayoutX(585 - searchSelector.getLayoutBounds().getWidth() / 2);
    searchSelector.setLayoutY(160);
    TextField search = new TextField();
    search.setPromptText("Search");
    search.setPrefWidth(480);
    search.setPrefHeight(searchSelector.getHeight());
    search.setLayoutX(100);
    search.setLayoutY(160);
    // Execute search on selection mode change
    searchSelector.setOnAction(event -> refreshTableData(search.getText(), (String) searchSelector.getSelectionModel().getSelectedItem()));
    // Execute search on any keystroke
    search.setOnKeyReleased(event -> {
        String query = search.getText();
        refreshTableData(query, (String) searchSelector.getSelectionModel().getSelectedItem());
    });
    scoresRoot.getChildren().addAll(table, searchSelector, search);
    // Menu setup
    menu.setFill(new ImagePattern(bg));
    Text title = new Text(120, 120, "3D Minesweeper");
    menuRoot.getChildren().add(title);
    title.setFont(new Font(70));
    title.setStroke(Color.BLACK);
    title.setStrokeWidth(5);
    title.setTextAlignment(TextAlignment.CENTER);
    title.setX(400 - title.getLayoutBounds().getWidth() / 2);
    Text name = new Text(150, 200, "Computer Science (ICS3U-01) FST\nBy Seth Damiani");
    menuRoot.getChildren().add(name);
    name.setFont(new Font(30));
    name.setTextAlignment(TextAlignment.CENTER);
    name.setStroke(Color.BLACK);
    name.setStrokeWidth(2);
    name.setX(400 - name.getLayoutBounds().getWidth() / 2);
    Rectangle easy = new Rectangle(250, 300, 300, 75);
    menuRoot.getChildren().add(easy);
    easy.setStroke(Color.BLACK);
    easy.setStrokeWidth(5);
    easy.setFill(new Color(1, 1, 1, .5));
    easy.setOnMouseEntered(event -> easy.setFill(new Color(1, 1, 1, .8)));
    easy.setOnMouseExited(event -> easy.setFill(new Color(1, 1, 1, .5)));
    Text easyText = new Text(400, 337.5, "Easy");
    menuRoot.getChildren().add(easyText);
    easyText.setFont(new Font(50));
    easyText.setTextAlignment(TextAlignment.CENTER);
    easyText.setStroke(Color.BLACK);
    easyText.setStrokeWidth(3);
    easyText.setX(400 - easyText.getLayoutBounds().getWidth() / 2);
    easyText.setY(350);
    easyText.setOnMouseEntered(event -> easy.setFill(new Color(1, 1, 1, .8)));
    easyText.setOnMouseExited(event -> easy.setFill(new Color(1, 1, 1, .5)));
    Rectangle medium = new Rectangle(250, 400, 300, 75);
    menuRoot.getChildren().add(medium);
    medium.setStroke(Color.BLACK);
    medium.setStrokeWidth(5);
    medium.setFill(Color.TRANSPARENT);
    medium.setFill(new Color(1, 1, 1, .5));
    medium.setOnMouseEntered(event -> medium.setFill(new Color(1, 1, 1, .8)));
    medium.setOnMouseExited(event -> medium.setFill(new Color(1, 1, 1, .5)));
    Text mediumText = new Text(400, 337.5, "Medium");
    menuRoot.getChildren().add(mediumText);
    mediumText.setFont(new Font(50));
    mediumText.setTextAlignment(TextAlignment.CENTER);
    mediumText.setStroke(Color.BLACK);
    mediumText.setStrokeWidth(3);
    mediumText.setX(400 - mediumText.getLayoutBounds().getWidth() / 2);
    mediumText.setY(450);
    mediumText.setOnMouseEntered(event -> medium.setFill(new Color(1, 1, 1, .8)));
    mediumText.setOnMouseExited(event -> medium.setFill(new Color(1, 1, 1, .5)));
    Rectangle hard = new Rectangle(250, 500, 300, 75);
    menuRoot.getChildren().add(hard);
    hard.setStroke(Color.BLACK);
    hard.setStrokeWidth(5);
    hard.setFill(Color.TRANSPARENT);
    hard.setFill(new Color(1, 1, 1, .5));
    hard.setOnMouseEntered(event -> hard.setFill(new Color(1, 1, 1, .8)));
    hard.setOnMouseExited(event -> hard.setFill(new Color(1, 1, 1, .5)));
    Text hardText = new Text(400, 337.5, "Hard");
    menuRoot.getChildren().add(hardText);
    hardText.setFont(new Font(50));
    hardText.setTextAlignment(TextAlignment.CENTER);
    hardText.setStroke(Color.BLACK);
    hardText.setStrokeWidth(3);
    hardText.setX(400 - hardText.getLayoutBounds().getWidth() / 2);
    hardText.setY(550);
    hardText.setOnMouseEntered(event -> hard.setFill(new Color(1, 1, 1, .8)));
    hardText.setOnMouseExited(event -> hard.setFill(new Color(1, 1, 1, .5)));
    Rectangle highscores = new Rectangle(600, 550, 150, 100);
    menuRoot.getChildren().add(highscores);
    highscores.setStroke(Color.BLACK);
    highscores.setStrokeWidth(5);
    highscores.setFill(Color.TRANSPARENT);
    highscores.setFill(new Color(1, 1, 1, .5));
    highscores.setOnMouseEntered(event -> highscores.setFill(new Color(1, 1, 1, .8)));
    highscores.setOnMouseExited(event -> highscores.setFill(new Color(1, 1, 1, .5)));
    Text highscoresText = new Text("High\nScores");
    menuRoot.getChildren().add(highscoresText);
    highscoresText.setFont(new Font(40));
    highscoresText.setTextAlignment(TextAlignment.CENTER);
    highscoresText.setStroke(Color.BLACK);
    highscoresText.setStrokeWidth(3);
    highscoresText.setX(675 - highscoresText.getLayoutBounds().getWidth() / 2);
    highscoresText.setY(590);
    highscoresText.setOnMouseEntered(event -> highscores.setFill(new Color(1, 1, 1, .8)));
    highscoresText.setOnMouseExited(event -> highscores.setFill(new Color(1, 1, 1, .5)));
    Rectangle exit = new Rectangle(50, 550, 150, 100);
    menuRoot.getChildren().add(exit);
    exit.setStroke(Color.BLACK);
    exit.setStrokeWidth(5);
    exit.setFill(Color.TRANSPARENT);
    exit.setFill(new Color(1, 1, 1, .5));
    exit.setOnMouseEntered(event -> exit.setFill(new Color(1, 1, 1, .8)));
    exit.setOnMouseExited(event -> exit.setFill(new Color(1, 1, 1, .5)));
    Text exitText = new Text("Exit");
    menuRoot.getChildren().add(exitText);
    exitText.setFont(new Font(40));
    exitText.setTextAlignment(TextAlignment.CENTER);
    exitText.setStroke(Color.BLACK);
    exitText.setStrokeWidth(3);
    exitText.setX(125 - exitText.getLayoutBounds().getWidth() / 2);
    exitText.setY(610);
    exitText.setOnMouseEntered(event -> exit.setFill(new Color(1, 1, 1, .8)));
    exitText.setOnMouseExited(event -> exit.setFill(new Color(1, 1, 1, .5)));
    // Handle click on easy button
    EventHandler<MouseEvent> easyButton = event -> {
        resetGame();
        placeBombs(50);
        totalBombs = 50;
        flaggedCells = 0;
        placeNumbers();
        bombs.setText("Bombs: " + flaggedCells + "/" + totalBombs);
        difficulty = "Easy";
        primaryStage.setScene(game);
        time = 0;
        timeTask.play();
    };
    easy.addEventHandler(MouseEvent.MOUSE_CLICKED, easyButton);
    easyText.addEventHandler(MouseEvent.MOUSE_CLICKED, easyButton);
    // Handle click on medium button
    EventHandler<MouseEvent> mediumButton = event -> {
        resetGame();
        placeBombs(100);
        totalBombs = 100;
        flaggedCells = 0;
        placeNumbers();
        bombs.setText("Bombs: " + flaggedCells + "/" + totalBombs);
        difficulty = "Medium";
        primaryStage.setScene(game);
        time = 0;
        timeTask.play();
    };
    medium.addEventHandler(MouseEvent.MOUSE_CLICKED, mediumButton);
    mediumText.addEventHandler(MouseEvent.MOUSE_CLICKED, mediumButton);
    // Handle click on hard button
    EventHandler<MouseEvent> hardButton = event -> {
        resetGame();
        placeBombs(150);
        totalBombs = 150;
        flaggedCells = 0;
        placeNumbers();
        bombs.setText("Bombs: " + flaggedCells + "/" + totalBombs);
        difficulty = "Hard";
        primaryStage.setScene(game);
        time = 0;
        timeTask.play();
    };
    hard.addEventHandler(MouseEvent.MOUSE_CLICKED, hardButton);
    hardText.addEventHandler(MouseEvent.MOUSE_CLICKED, hardButton);
    EventHandler<MouseEvent> exitButton = event -> System.exit(0);
    exit.addEventHandler(MouseEvent.MOUSE_CLICKED, exitButton);
    exitText.addEventHandler(MouseEvent.MOUSE_CLICKED, exitButton);
    EventHandler<MouseEvent> highScoresButton = event -> primaryStage.setScene(scores);
    highscoresText.addEventHandler(MouseEvent.MOUSE_CLICKED, highScoresButton);
    highscores.addEventHandler(MouseEvent.MOUSE_CLICKED, highScoresButton);
    readHighScores();
    refreshTableData();
    // Continuously check if game has been won or lost
    game.setOnMouseClicked(event -> {
        if (gameLost) {
            timeTask.stop();
            endScoreText.setText("Time: " + time);
            endScoreText.setX(400 - endScoreText.getLayoutBounds().getWidth() / 2);
            quitBox.setFill(Color.INDIANRED);
            quitText.setText("You Lost");
            quitText.setX(400 - quitText.getLayoutBounds().getWidth() / 2);
            firstNameBox.setVisible(false);
            lastNameBox.setVisible(false);
            endScoreText.setVisible(false);
            continueText.setText("Menu");
            continueText.setX(400 - continueText.getLayoutBounds().getWidth() / 2);
            continueRect.setWidth(continueText.getLayoutBounds().getWidth() + 40);
            continueRect.setX(400 - continueRect.getLayoutBounds().getWidth() / 2);
            primaryStage.setScene(quit);
        }
        if (gameWon) {
            timeTask.stop();
            quitBox.setFill(Color.FORESTGREEN);
            quitText.setText("You Won!");
            quitText.setX(400 - quitText.getLayoutBounds().getWidth() / 2);
            firstNameBox.setVisible(true);
            lastNameBox.setVisible(true);
            endScoreText.setVisible(true);
            endScoreText.setText("Time: " + time);
            continueText.setText("Submit & Continue");
            continueText.setX(400 - continueText.getLayoutBounds().getWidth() / 2);
            continueRect.setWidth(continueText.getLayoutBounds().getWidth() + 40);
            continueRect.setX(400 - continueRect.getLayoutBounds().getWidth() / 2);
            primaryStage.setScene(quit);
        }
    });
    primaryStage.setTitle("Minesweeper 3D - Seth Damiani");
    primaryStage.setResizable(false);
    primaryStage.setScene(menu);
    primaryStage.show();
}
Also used : EventHandler(javafx.event.EventHandler) FontWeight(javafx.scene.text.FontWeight) Scene(javafx.scene.Scene) MouseButton(javafx.scene.input.MouseButton) java.util(java.util) Point3D(javafx.geometry.Point3D) javafx.scene.control(javafx.scene.control) Rotate(javafx.scene.transform.Rotate) MouseEvent(javafx.scene.input.MouseEvent) FXCollections(javafx.collections.FXCollections) TextFieldTableCell(javafx.scene.control.cell.TextFieldTableCell) Application(javafx.application.Application) TextAlignment(javafx.scene.text.TextAlignment) RotateTransition(javafx.animation.RotateTransition) PrintWriter(java.io.PrintWriter) KeyCode(javafx.scene.input.KeyCode) HBox(javafx.scene.layout.HBox) Color(javafx.scene.paint.Color) KeyFrame(javafx.animation.KeyFrame) PropertyValueFactory(javafx.scene.control.cell.PropertyValueFactory) Font(javafx.scene.text.Font) FileWriter(java.io.FileWriter) Timeline(javafx.animation.Timeline) ImagePattern(javafx.scene.paint.ImagePattern) Rectangle(javafx.scene.shape.Rectangle) IOException(java.io.IOException) KeyEvent(javafx.scene.input.KeyEvent) Group(javafx.scene.Group) File(java.io.File) Text(javafx.scene.text.Text) Duration(javafx.util.Duration) Interpolator(javafx.animation.Interpolator) Stage(javafx.stage.Stage) ObservableList(javafx.collections.ObservableList) Image(javafx.scene.image.Image) HBox(javafx.scene.layout.HBox) Rectangle(javafx.scene.shape.Rectangle) Font(javafx.scene.text.Font) ImagePattern(javafx.scene.paint.ImagePattern) TextFieldTableCell(javafx.scene.control.cell.TextFieldTableCell) MouseEvent(javafx.scene.input.MouseEvent) Color(javafx.scene.paint.Color) Text(javafx.scene.text.Text) IOException(java.io.IOException) Timeline(javafx.animation.Timeline) KeyFrame(javafx.animation.KeyFrame)

Aggregations

ObservableList (javafx.collections.ObservableList)77 List (java.util.List)46 ArrayList (java.util.ArrayList)31 Collectors (java.util.stream.Collectors)29 Map (java.util.Map)28 FXCollections (javafx.collections.FXCollections)28 HashMap (java.util.HashMap)21 Node (javafx.scene.Node)20 TableColumn (javafx.scene.control.TableColumn)20 Label (javafx.scene.control.Label)18 Optional (java.util.Optional)17 ActionEvent (javafx.event.ActionEvent)16 FXML (javafx.fxml.FXML)16 TableView (javafx.scene.control.TableView)16 MouseEvent (javafx.scene.input.MouseEvent)16 Logger (org.slf4j.Logger)16 LoggerFactory (org.slf4j.LoggerFactory)16 Button (javafx.scene.control.Button)15 BorderPane (javafx.scene.layout.BorderPane)15 File (java.io.File)14