From 4cfe7fbda068ab43760fe7c19841b48e6005d72a Mon Sep 17 00:00:00 2001 From: Paryss Mullier <paryss.mullier.etu@univ-lille.fr> Date: Mon, 7 Oct 2024 16:03:52 +0200 Subject: [PATCH] =?UTF-8?q?phase=20impl=C3=A9mentation=20observer,=20obser?= =?UTF-8?q?vable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/univlille/iut/r304/thermo/Main.java | 32 ++------ .../iut/r304/thermo/model/Thermostat.java | 4 +- .../iut/r304/thermo/view/TemperatureView.java | 82 +++++++++++++++++++ .../iut/r304/thermo/view/ThermoSlider.java | 59 +++++++++++++ 4 files changed, 150 insertions(+), 27 deletions(-) create mode 100644 src/main/java/fr/univlille/iut/r304/thermo/view/TemperatureView.java create mode 100644 src/main/java/fr/univlille/iut/r304/thermo/view/ThermoSlider.java diff --git a/src/main/java/fr/univlille/iut/r304/thermo/Main.java b/src/main/java/fr/univlille/iut/r304/thermo/Main.java index 09ffce5..d8d8db7 100644 --- a/src/main/java/fr/univlille/iut/r304/thermo/Main.java +++ b/src/main/java/fr/univlille/iut/r304/thermo/Main.java @@ -1,13 +1,10 @@ package fr.univlille.iut.r304.thermo; import fr.univlille.iut.r304.thermo.model.Thermostat; +import fr.univlille.iut.r304.thermo.view.TemperatureView; import fr.univlille.iut.r304.thermo.view.TextView; +import fr.univlille.iut.r304.thermo.view.ThermoSlider; import javafx.application.Application; -import javafx.geometry.Pos; -import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.layout.VBox; import javafx.stage.Stage; public class Main extends Application { @@ -19,27 +16,10 @@ public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { Thermostat thermo = new Thermostat(); - new TextView(thermo); - // Interface avec la température au centre et un bouton decrement et un bouton - // increment en JavaFX - VBox root = new VBox(); - root.setAlignment(Pos.CENTER); - root.setSpacing(10); - - Label temperatureLabel = new Label(thermo.getTemperature() + "°C"); - - Button incrementButton = new Button("Increment"); - incrementButton.setOnMouseClicked(e -> thermo.incrementTemperature()); - - Button decrementButton = new Button("Decrement"); - decrementButton.setOnMouseClicked(e -> thermo.decrementTemperature()); - - root.getChildren().addAll(temperatureLabel, incrementButton, decrementButton); - - Scene scene = new Scene(root, 300, 200); - primaryStage.setScene(scene); - primaryStage.setTitle("Thermostat"); - primaryStage.show(); + TemperatureView view = new TemperatureView(thermo); + TextView textView = new TextView(thermo); + ThermoSlider slider = new ThermoSlider(thermo); + slider.start(); } diff --git a/src/main/java/fr/univlille/iut/r304/thermo/model/Thermostat.java b/src/main/java/fr/univlille/iut/r304/thermo/model/Thermostat.java index 4812cf0..9536b1e 100644 --- a/src/main/java/fr/univlille/iut/r304/thermo/model/Thermostat.java +++ b/src/main/java/fr/univlille/iut/r304/thermo/model/Thermostat.java @@ -1,6 +1,8 @@ package fr.univlille.iut.r304.thermo.model; -public class Thermostat implements ITemperature { +import fr.univlille.iut.r304.utils.Observable; + +public class Thermostat extends Observable implements ITemperature { private double temperature; diff --git a/src/main/java/fr/univlille/iut/r304/thermo/view/TemperatureView.java b/src/main/java/fr/univlille/iut/r304/thermo/view/TemperatureView.java new file mode 100644 index 0000000..5ba01c6 --- /dev/null +++ b/src/main/java/fr/univlille/iut/r304/thermo/view/TemperatureView.java @@ -0,0 +1,82 @@ +package fr.univlille.iut.r304.thermo.view; + +import fr.univlille.iut.r304.thermo.model.Thermostat; +import fr.univlille.iut.r304.utils.Observer; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class TemperatureView implements ITemperatureView, Observer { + + @Override + public void decrementAction() { + thermostat.decrementTemperature(); + updateTemperatureField(); + } + + @Override + public void incrementAction() { + thermostat.incrementTemperature(); + updateTemperatureField(); + } + + @Override + public double getDisplayedValue() { + return thermostat.getTemperature(); + } + + private Thermostat thermostat; + private TextField temperatureField; + + public TemperatureView(Thermostat thermostat) { + this.thermostat = thermostat; + start(new Stage()); + } + + public void start(Stage stage) { + VBox root = new VBox(); + root.setAlignment(Pos.CENTER); + root.setSpacing(10); + + temperatureField = new TextField(thermostat.getTemperature() + "°C"); + temperatureField.setMaxWidth(100); // Set a fixed width for alignment + + Button incrementButton = new Button("+"); + incrementButton.setMaxWidth(100); // Set a fixed width for alignment + incrementButton.setOnMouseClicked(e -> { + thermostat.incrementTemperature(); + updateTemperatureField(); + }); + + Button decrementButton = new Button("-"); + decrementButton.setMaxWidth(100); // Set a fixed width for alignment + decrementButton.setOnMouseClicked(e -> { + thermostat.decrementTemperature(); + updateTemperatureField(); + }); + + temperatureField.setOnAction(e -> { + try { + int newTemp = Integer.parseInt(temperatureField.getText().replace("°C", "").trim()); + thermostat.setTemperature(newTemp); + updateTemperatureField(); + } catch (NumberFormatException ex) { + updateTemperatureField(); // Reset to current temperature on invalid input + } + }); + + root.getChildren().addAll(incrementButton, temperatureField, decrementButton); + + Scene scene = new Scene(root, 300, 200); + stage.setScene(scene); + stage.setTitle("Thermostat"); + stage.show(); + } + + private void updateTemperatureField() { + temperatureField.setText(thermostat.getTemperature() + "°C"); + } +} diff --git a/src/main/java/fr/univlille/iut/r304/thermo/view/ThermoSlider.java b/src/main/java/fr/univlille/iut/r304/thermo/view/ThermoSlider.java new file mode 100644 index 0000000..6ed5251 --- /dev/null +++ b/src/main/java/fr/univlille/iut/r304/thermo/view/ThermoSlider.java @@ -0,0 +1,59 @@ +package fr.univlille.iut.r304.thermo.view; + +import fr.univlille.iut.r304.thermo.model.Thermostat; +import fr.univlille.iut.r304.utils.Observer; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class ThermoSlider implements Observer { + + Thermostat thermo; + + public ThermoSlider(Thermostat thermo) { + this.thermo = thermo; + } + + public void start() { + Stage sliderStage = new Stage(); + VBox sliderRoot = createSliderRoot(); + Scene sliderScene = new Scene(sliderRoot, 300, 200); + sliderStage.setScene(sliderScene); + sliderStage.setTitle("Adjust Temperature"); + sliderStage.show(); + } + + private VBox createSliderRoot() { + VBox sliderRoot = new VBox(); + sliderRoot.setAlignment(Pos.CENTER); + sliderRoot.setSpacing(1); + + Label sliderLabel = new Label("Adjust Temperature"); + Slider temperatureSlider = createTemperatureSlider(); + + sliderRoot.getChildren().addAll(sliderLabel, temperatureSlider); + return sliderRoot; + } + + private Slider createTemperatureSlider() { + Slider temperatureSlider = new Slider(-20, 40, thermo.getTemperature()); + temperatureSlider.setOrientation(javafx.geometry.Orientation.VERTICAL); + temperatureSlider.setShowTickLabels(true); + temperatureSlider.setShowTickMarks(true); + temperatureSlider.setMajorTickUnit(10); + temperatureSlider.setMinorTickCount(1); + temperatureSlider.setBlockIncrement(1); + + temperatureSlider.valueProperty().addListener((obs, oldVal, newVal) -> { + thermo.setTemperature(newVal.intValue()); + // Assuming temperatureField is a TextField or similar component + // temperatureField.setText(thermo.getTemperature() + "°C"); + temperatureSlider.setValue(newVal.doubleValue()); // Update the slider position + }); + + return temperatureSlider; + } +} -- GitLab