/
ledart
/
RRP_LedNik
Обзор
Документация
Войти
/
ledart
/
RRP_LedNik
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
client/UI/LeaderboardScreen.java
142 строки
5 KB
Darya
Реализация системы Top Scores
18 дек 2025, 01:53
18 дек 2025, 01:53
ee2b0fe
Код
Авторство
О чём код?
package client.UI; import javafx.application.Platform; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.VBox; import javafx.stage.Stage; import client.Network; import client.model.ScoreRecord; public class LeaderboardScreen { private Network network; private Stage stage; private TableView<ScoreRecord> table; private ObservableList<ScoreRecord> scores; private LobbyScreen lobbyScreen; public LeaderboardScreen(Network network, Stage stage, LobbyScreen lobbyScreen) { this.network = network; this.stage = stage; this.lobbyScreen = lobbyScreen; this.scores = FXCollections.observableArrayList(); this.table = new TableView<>(); setupNetworkCallbacks(); } private void setupNetworkCallbacks() { network.setOnMessageCallback(msg -> { Platform.runLater(() -> { if (msg.startsWith("TOP_SCORES_START")) { scores.clear(); } else if (msg.startsWith("TOP_SCORES_ROW:")) { String data = msg.substring(15); String[] parts = data.split(":", 3); if (parts.length >= 3) { String player = parts[0]; int score; try { score = Integer.parseInt(parts[1]); } catch (NumberFormatException e) { score = 0; } String date = parts[2]; scores.add(new ScoreRecord(player, score, date)); } } else if (msg.equals("TOP_SCORES_END")) { table.refresh(); } else if (msg.equals("TOP_SCORES_EMPTY")) { scores.clear(); table.refresh(); } else if (msg.startsWith("ERROR:")) { showError(msg.substring(6)); } }); }); } public void start() { network.setCurrentScreen("LEADERBOARD"); VBox root = new VBox(10); root.setPadding(new Insets(20)); Label titleLabel = new Label("Top Scores"); titleLabel.setStyle("-fx-font-size: 14px; -fx-font-weight: bold;"); setupTable(); Button refreshButton = new Button("Refresh"); refreshButton.setOnAction(e -> { scores.clear(); network.sendMessage("GET_TOP_SCORES"); }); Button backButton = new Button("Back to Lobby"); backButton.setOnAction(e -> { if (lobbyScreen != null) { lobbyScreen.start(); } }); VBox buttonBox = new VBox(5, refreshButton, backButton); root.getChildren().addAll(titleLabel, table, buttonBox); Scene scene = new Scene(root, 450, 350); stage.setScene(scene); stage.setTitle("Chase Snake - Leaderboard"); stage.show(); network.sendMessage("GET_TOP_SCORES"); } private void setupTable() { table.setItems(scores); table.setPrefHeight(250); TableColumn<ScoreRecord, String> playerCol = new TableColumn<>("Player"); playerCol.setCellValueFactory(cellData -> javafx.beans.binding.Bindings.createStringBinding( () -> cellData.getValue().getPlayerName() ) ); playerCol.setPrefWidth(150); TableColumn<ScoreRecord, Integer> scoreCol = new TableColumn<>("Score"); scoreCol.setCellValueFactory(cellData -> javafx.beans.binding.Bindings.createObjectBinding( () -> cellData.getValue().getScore() ) ); scoreCol.setPrefWidth(100); TableColumn<ScoreRecord, String> dateCol = new TableColumn<>("Date"); dateCol.setCellValueFactory(cellData -> javafx.beans.binding.Bindings.createStringBinding( () -> cellData.getValue().getDate() ) ); dateCol.setPrefWidth(200); table.getColumns().addAll(playerCol, scoreCol, dateCol); } private void showError(String message) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle("Error"); alert.setHeaderText("Failed to load scores"); alert.setContentText(message); alert.show(); } }