/
V.S.Femit
/
Lab1
Обзор
Документация
Войти
/
V.S.Femit
/
Lab1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/main/java/com/example/lab1/ObserverDemo.java
222 строки
8 KB
V.S.Femit
upload files
02 фев 2026, 11:19
Верифицирован
02 фев 2026, 11:19
44f5903
Код
Авторство
О чём код?
package com.example.lab1; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.stage.Stage; import javafx.geometry.Insets; import javafx.geometry.Pos; public class ObserverDemo extends Application { private TimeServer timeServer; private TextDisplay textDisplay; private Signal signal; private AnimationObserver animation; private Label statusLabel; private Label textDisplayLabel; private Label signalStatusLabel; private Label animationStatusLabel; private TextField signalIntervalField; private TextField animationIntervalField; @Override public void start(Stage primaryStage) { // Создаём сервер времени timeServer = new TimeServer(); // Создаём наблюдателей textDisplay = new TextDisplay(timeServer); signal = new Signal(timeServer, 5); // Каждые 5 секунд animation = new AnimationObserver(timeServer); // Создаём GUI BorderPane root = new BorderPane(); // Панель запуска сервера (верх) VBox serverPanel = createServerPanel(); root.setTop(serverPanel); // Три панели для наблюдателей (центр) HBox observersPanel = createObserversPanel(); root.setCenter(observersPanel); Scene scene = new Scene(root, 800, 500); primaryStage.setTitle("Task 7. Наблюдатель (строго по методичке)"); primaryStage.setScene(scene); primaryStage.show(); } private VBox createServerPanel() { VBox panel = new VBox(10); panel.setPadding(new Insets(10)); panel.setStyle("-fx-border-color: #333; -fx-border-width: 2px;"); Label title = new Label("Сервер локального времени"); title.setStyle("-fx-font-size: 16px; -fx-font-weight: bold;"); HBox buttonBox = new HBox(10); Button startBtn = new Button("Запуск сервера"); Button stopBtn = new Button("Остановить сервер"); Button resetBtn = new Button("Сброс (0 сек)"); startBtn.setOnAction(e -> { timeServer.start(); statusLabel.setText("Статус: АКТИВЕН"); }); stopBtn.setOnAction(e -> { timeServer.stop(); statusLabel.setText("Статус: НЕАКТИВЕН"); }); resetBtn.setOnAction(e -> { timeServer.setState(0); }); buttonBox.getChildren().addAll(startBtn, stopBtn, resetBtn); statusLabel = new Label("Статус: НЕАКТИВЕН"); panel.getChildren().addAll(title, buttonBox, statusLabel); return panel; } private HBox createObserversPanel() { HBox panel = new HBox(10); panel.setPadding(new Insets(10)); // Панель 1: Текстовый дисплей VBox textPanel = new VBox(10); textPanel.setPadding(new Insets(10)); textPanel.setStyle("-fx-border-color: blue; -fx-border-width: 1px;"); Label textTitle = new Label("1. Текстовое сообщение"); textTitle.setStyle("-fx-font-weight: bold;"); textDisplayLabel = new Label("Прошло 0 с"); textDisplayLabel.setStyle("-fx-font-size: 18px;"); // Обновление текста new Thread(() -> { while (true) { try { Thread.sleep(100); javafx.application.Platform.runLater(() -> { int time = timeServer.getState(); textDisplayLabel.setText("Прошло " + time + " с"); }); } catch (InterruptedException e) { break; } } }).start(); textPanel.getChildren().addAll(textTitle, textDisplayLabel); // Панель 2: Сигнал VBox signalPanel = new VBox(10); signalPanel.setPadding(new Insets(10)); signalPanel.setStyle("-fx-border-color: green; -fx-border-width: 1px;"); Label signalTitle = new Label("2. Сигнал (звук)"); signalTitle.setStyle("-fx-font-weight: bold;"); signalStatusLabel = new Label("Интервал: 5 секунд"); HBox signalControl = new HBox(10); Label intervalLabel1 = new Label("Интервал (сек):"); signalIntervalField = new TextField("5"); signalIntervalField.setPrefWidth(60); Button setSignalBtn = new Button("Установить"); setSignalBtn.setOnAction(e -> { try { int interval = Integer.parseInt(signalIntervalField.getText()); if (interval > 0) { signal.onComp(interval); signalStatusLabel.setText("Интервал: " + interval + " секунд"); } } catch (NumberFormatException ex) { signalStatusLabel.setText("Ошибка ввода!"); } }); signalControl.getChildren().addAll(intervalLabel1, signalIntervalField, setSignalBtn); CheckBox signalCheck = new CheckBox("Включить сигнал"); signalCheck.setSelected(true); signalCheck.setOnAction(e -> { if (signalCheck.isSelected()) { signal.onComp(Integer.parseInt(signalIntervalField.getText())); } else { signal.offComp(); } }); signalPanel.getChildren().addAll(signalTitle, signalStatusLabel, signalControl, signalCheck); // Панель 3: Анимация VBox animPanel = new VBox(10); animPanel.setPadding(new Insets(10)); animPanel.setStyle("-fx-border-color: orange; -fx-border-width: 1px;"); Label animTitle = new Label("3. Анимация процесса"); animTitle.setStyle("-fx-font-weight: bold;"); animationStatusLabel = new Label("Повтор каждые 20 секунд"); HBox animControl = new HBox(10); Label intervalLabel2 = new Label("Интервал (сек):"); animationIntervalField = new TextField("20"); animationIntervalField.setPrefWidth(60); Button setAnimBtn = new Button("Установить"); setAnimBtn.setOnAction(e -> { animationStatusLabel.setText("Интервал обновлён"); }); animControl.getChildren().addAll(intervalLabel2, animationIntervalField, setAnimBtn); CheckBox animCheck = new CheckBox("Включить анимацию"); animCheck.setSelected(true); animCheck.setOnAction(e -> { animation.setActive(animCheck.isSelected()); }); // Имитация анимации ProgressBar progressBar = new ProgressBar(0); progressBar.setPrefWidth(200); // Обновление прогресса new Thread(() -> { while (true) { try { Thread.sleep(100); javafx.application.Platform.runLater(() -> { int time = timeServer.getState(); double progress = (time % 20) / 20.0; progressBar.setProgress(progress); }); } catch (InterruptedException e) { break; } } }).start(); animPanel.getChildren().addAll(animTitle, animationStatusLabel, animControl, animCheck, progressBar); panel.getChildren().addAll(textPanel, signalPanel, animPanel); return panel; } @Override public void stop() { // Очистка ресурсов timeServer.stop(); } public static void main(String[] args) { launch(args); } }