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;
}
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();
}
Aggregations