@ -0,0 +1,3 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" project-jdk-name="18" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/Thermometre.iml" filepath="$PROJECT_DIR$/Thermometre.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.image.ImageView?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1">
|
||||
<center>
|
||||
<ImageView fx:id="imageView" fitHeight="400.0" fitWidth="425.0" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER" />
|
||||
</center>
|
||||
<bottom>
|
||||
<Button mnemonicParsing="false" onAction="#boutonFermer" text="Fermer" BorderPane.alignment="CENTER" fx:id="bouton">
|
||||
<BorderPane.margin>
|
||||
<Insets bottom="30.0" top="50.0" />
|
||||
</BorderPane.margin>
|
||||
</Button> </bottom>
|
||||
<top>
|
||||
<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="100.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Image" />
|
||||
<HBox prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Capteur :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Text fx:id="nomDuCapteur" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
</children>
|
||||
<BorderPane.margin>
|
||||
<Insets top="20.0" />
|
||||
</BorderPane.margin>
|
||||
</VBox>
|
||||
</top>
|
||||
</BorderPane>
|
@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ComboBox?>
|
||||
<?import javafx.scene.control.Spinner?>
|
||||
<?import javafx.scene.control.TableColumn?>
|
||||
<?import javafx.scene.control.TableView?>
|
||||
<?import javafx.scene.control.TextField?>
|
||||
<?import javafx.scene.control.ToggleButton?>
|
||||
<?import javafx.scene.control.TreeView?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
|
||||
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="views.fenetre.FenetreMenu">
|
||||
<left>
|
||||
<TreeView fx:id="treeView" prefHeight="200.0" prefWidth="250.0" BorderPane.alignment="CENTER" />
|
||||
</left>
|
||||
<center>
|
||||
<VBox prefHeight="200.0" prefWidth="100.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<TextField fx:id="nomDuCapteur" text="Nom" />
|
||||
<HBox prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Température :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin></Text>
|
||||
<Text fx:id="temperature" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<HBox prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="ID :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin></Text>
|
||||
<Text fx:id="idDuCpateur" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<HBox prefWidth="200.0" fx:id="strategie">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Choix stratégie :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<ComboBox fx:id="comboBox" prefWidth="150.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<ToggleButton fx:id="toggleButton" />
|
||||
<HBox prefWidth="200.0" fx:id="frequence">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Tick génération (en seconde) :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Spinner fx:id="spinner" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<TableView fx:id="tableView" prefHeight="200.0" prefWidth="200.0">
|
||||
<columns>
|
||||
<TableColumn fx:id="tableType" prefWidth="75.0" text="Type" />
|
||||
<TableColumn fx:id="tablePoids" prefWidth="75.0" text="Coeff" />
|
||||
<TableColumn fx:id="tableId" prefWidth="75.0" text="Id" />
|
||||
</columns>
|
||||
</TableView>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
|
||||
</padding>
|
||||
</VBox>
|
||||
</center>
|
||||
<bottom>
|
||||
<HBox alignment="CENTER" prefHeight="50.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<Button fx:id="boutonDuSlider" mnemonicParsing="false" onAction="#boutonSlider" text="Thermostat">
|
||||
<HBox.margin>
|
||||
<Insets right="20.0" />
|
||||
</HBox.margin>
|
||||
</Button>
|
||||
<Button mnemonicParsing="false" onAction="#boutonImage" text="Image">
|
||||
<HBox.margin>
|
||||
<Insets right="20.0" />
|
||||
</HBox.margin>
|
||||
</Button>
|
||||
<Button mnemonicParsing="false" onAction="#boutonFermer" text="Fermer" />
|
||||
</children>
|
||||
</HBox>
|
||||
</bottom>
|
||||
</BorderPane>
|
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.Slider?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
|
||||
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1">
|
||||
<center>
|
||||
<Slider fx:id="slider" max="70" min="-30" orientation="VERTICAL" showTickLabels="true" showTickMarks="true" value="0" BorderPane.alignment="CENTER">
|
||||
<BorderPane.margin>
|
||||
<Insets />
|
||||
</BorderPane.margin>
|
||||
</Slider>
|
||||
</center>
|
||||
<bottom>
|
||||
<Button mnemonicParsing="false" onAction="#butonFermer" text="Fermer" BorderPane.alignment="CENTER">
|
||||
<BorderPane.margin>
|
||||
<Insets bottom="30.0" top="50.0" />
|
||||
</BorderPane.margin>
|
||||
</Button>
|
||||
</bottom>
|
||||
<top>
|
||||
<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="100.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="thermometre" />
|
||||
<HBox prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Capteur :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Text fx:id="nomDuCapteur" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<HBox prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Température :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Text fx:id="valTemperature" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
</children>
|
||||
<BorderPane.margin>
|
||||
<Insets top="20.0" />
|
||||
</BorderPane.margin>
|
||||
</VBox>
|
||||
</top>
|
||||
</BorderPane>
|
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 181 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 139 KiB |
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$">
|
||||
<sourceFolder url="file://$MODULE_DIR$/Ressources" type="java-resource" />
|
||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||
</content>
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
<orderEntry type="library" exported="" name="lib" level="application" />
|
||||
</component>
|
||||
</module>
|
@ -0,0 +1,41 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.image.ImageView?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1">
|
||||
<center>
|
||||
<ImageView fx:id="imageView" fitHeight="400.0" fitWidth="425.0" pickOnBounds="true" preserveRatio="true" BorderPane.alignment="CENTER" />
|
||||
</center>
|
||||
<bottom>
|
||||
<Button mnemonicParsing="false" onAction="#boutonFermer" text="Fermer" BorderPane.alignment="CENTER" fx:id="bouton">
|
||||
<BorderPane.margin>
|
||||
<Insets bottom="30.0" top="50.0" />
|
||||
</BorderPane.margin>
|
||||
</Button> </bottom>
|
||||
<top>
|
||||
<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="100.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Image" />
|
||||
<HBox prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Capteur :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Text fx:id="nomDuCapteur" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
</children>
|
||||
<BorderPane.margin>
|
||||
<Insets top="20.0" />
|
||||
</BorderPane.margin>
|
||||
</VBox>
|
||||
</top>
|
||||
</BorderPane>
|
@ -0,0 +1,100 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.ComboBox?>
|
||||
<?import javafx.scene.control.Spinner?>
|
||||
<?import javafx.scene.control.TableColumn?>
|
||||
<?import javafx.scene.control.TableView?>
|
||||
<?import javafx.scene.control.TextField?>
|
||||
<?import javafx.scene.control.ToggleButton?>
|
||||
<?import javafx.scene.control.TreeView?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
|
||||
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="views.fenetre.FenetreMenu">
|
||||
<left>
|
||||
<TreeView fx:id="treeView" prefHeight="200.0" prefWidth="250.0" BorderPane.alignment="CENTER" />
|
||||
</left>
|
||||
<center>
|
||||
<VBox prefHeight="200.0" prefWidth="100.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<TextField fx:id="nomDuCapteur" text="Nom" />
|
||||
<HBox prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Température :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin></Text>
|
||||
<Text fx:id="temperature" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<HBox prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="ID :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin></Text>
|
||||
<Text fx:id="idDuCpateur" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets bottom="15.0" />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<HBox prefWidth="200.0" fx:id="strategie">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Choix stratégie :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<ComboBox fx:id="comboBox" prefWidth="150.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<ToggleButton fx:id="toggleButton" />
|
||||
<HBox prefWidth="200.0" fx:id="frequence">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Tick génération (en seconde) :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Spinner fx:id="spinner" />
|
||||
</children>
|
||||
<VBox.margin>
|
||||
<Insets />
|
||||
</VBox.margin>
|
||||
</HBox>
|
||||
<TableView fx:id="tableView" prefHeight="200.0" prefWidth="200.0">
|
||||
<columns>
|
||||
<TableColumn fx:id="tableType" prefWidth="75.0" text="Type" />
|
||||
<TableColumn fx:id="tablePoids" prefWidth="75.0" text="Coeff" />
|
||||
<TableColumn fx:id="tableId" prefWidth="75.0" text="Id" />
|
||||
</columns>
|
||||
</TableView>
|
||||
</children>
|
||||
<padding>
|
||||
<Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
|
||||
</padding>
|
||||
</VBox>
|
||||
</center>
|
||||
<bottom>
|
||||
<HBox alignment="CENTER" prefHeight="50.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<Button fx:id="boutonDuSlider" mnemonicParsing="false" onAction="#boutonSlider" text="Thermostat">
|
||||
<HBox.margin>
|
||||
<Insets right="20.0" />
|
||||
</HBox.margin>
|
||||
</Button>
|
||||
<Button mnemonicParsing="false" onAction="#boutonImage" text="Image">
|
||||
<HBox.margin>
|
||||
<Insets right="20.0" />
|
||||
</HBox.margin>
|
||||
</Button>
|
||||
<Button mnemonicParsing="false" onAction="#boutonFermer" text="Fermer" />
|
||||
</children>
|
||||
</HBox>
|
||||
</bottom>
|
||||
</BorderPane>
|
@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<?import javafx.geometry.Insets?>
|
||||
<?import javafx.scene.control.Button?>
|
||||
<?import javafx.scene.control.Slider?>
|
||||
<?import javafx.scene.layout.BorderPane?>
|
||||
<?import javafx.scene.layout.HBox?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.text.Text?>
|
||||
|
||||
<BorderPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1">
|
||||
<center>
|
||||
<Slider fx:id="slider" max="70" min="-30" orientation="VERTICAL" showTickLabels="true" showTickMarks="true" value="0" BorderPane.alignment="CENTER">
|
||||
<BorderPane.margin>
|
||||
<Insets />
|
||||
</BorderPane.margin>
|
||||
</Slider>
|
||||
</center>
|
||||
<bottom>
|
||||
<Button mnemonicParsing="false" onAction="#butonFermer" text="Fermer" BorderPane.alignment="CENTER">
|
||||
<BorderPane.margin>
|
||||
<Insets bottom="30.0" top="50.0" />
|
||||
</BorderPane.margin>
|
||||
</Button>
|
||||
</bottom>
|
||||
<top>
|
||||
<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="50.0" prefWidth="100.0" BorderPane.alignment="CENTER">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="thermometre" />
|
||||
<HBox prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Capteur :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Text fx:id="nomDuCapteur" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
<HBox prefHeight="100.0" prefWidth="200.0">
|
||||
<children>
|
||||
<Text strokeType="OUTSIDE" strokeWidth="0.0" text="Température :">
|
||||
<HBox.margin>
|
||||
<Insets right="5.0" />
|
||||
</HBox.margin>
|
||||
</Text>
|
||||
<Text fx:id="valTemperature" strokeType="OUTSIDE" strokeWidth="0.0" />
|
||||
</children>
|
||||
</HBox>
|
||||
</children>
|
||||
<BorderPane.margin>
|
||||
<Insets top="20.0" />
|
||||
</BorderPane.margin>
|
||||
</VBox>
|
||||
</top>
|
||||
</BorderPane>
|
After Width: | Height: | Size: 5.3 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 76 KiB |
After Width: | Height: | Size: 181 KiB |
After Width: | Height: | Size: 10 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 139 KiB |
@ -0,0 +1,45 @@
|
||||
package DonneePersistante;
|
||||
|
||||
import models.TachePeriodique;
|
||||
import models.capteurs.CapteurTemperature;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
import models.capteurs.CapteurTemperatureVirtuel;
|
||||
import models.generateurs.GenerateurAleatoire;
|
||||
import models.generateurs.GeneratureParIntervalle;
|
||||
|
||||
public class Stub {
|
||||
|
||||
public static CapteurTemperatureAbstrait chargerArbre(TachePeriodique tachePeriodique) {
|
||||
|
||||
|
||||
CapteurTemperatureAbstrait CapteurEnRacine = new CapteurTemperatureVirtuel("Capteur virtuel", 5);
|
||||
|
||||
|
||||
CapteurTemperature capteur1 = new CapteurTemperature("Capteur 1", 5, new GenerateurAleatoire(), tachePeriodique);
|
||||
CapteurTemperature capteur2 = new CapteurTemperature("Capteur 2", 5, null, tachePeriodique);
|
||||
CapteurTemperature capteur3 = new CapteurTemperature("Capteur 3", 10, new GeneratureParIntervalle(30,5), tachePeriodique);
|
||||
CapteurTemperature capteur4 = new CapteurTemperature("Capteur 4", -9, null, tachePeriodique);
|
||||
CapteurTemperature capteur5 = new CapteurTemperature("Capteur 5", 65, null, tachePeriodique);
|
||||
|
||||
|
||||
CapteurTemperatureAbstrait capteurVirtuel1 = new CapteurTemperatureVirtuel("Capteur virtuel 1", 5);
|
||||
CapteurTemperatureAbstrait capteurVirtuel2 = new CapteurTemperatureVirtuel("Capteur virtuel 2", 5);
|
||||
|
||||
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel1).AjouterUnCapteur(capteur1,1);
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel1).AjouterUnCapteur(capteur2,1);
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel1).AjouterUnCapteur(capteur3,2);
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel1).AjouterUnCapteur(capteurVirtuel2,2);
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel2).AjouterUnCapteur(capteur4,2);
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel2).AjouterUnCapteur(capteur1,2);
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel2).MiseAjourTemperature();
|
||||
((CapteurTemperatureVirtuel)capteurVirtuel1).MiseAjourTemperature();
|
||||
|
||||
|
||||
((CapteurTemperatureVirtuel)CapteurEnRacine).AjouterUnCapteur(capteurVirtuel1,2);
|
||||
((CapteurTemperatureVirtuel)CapteurEnRacine).AjouterUnCapteur(capteur5,2);
|
||||
|
||||
|
||||
return CapteurEnRacine;
|
||||
}
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package launchers;
|
||||
|
||||
import javafx.application.Application;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Parent;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.stage.Stage;
|
||||
|
||||
public class ThermometreApplication extends Application {
|
||||
@Override
|
||||
public void start(Stage stage) throws Exception {
|
||||
Parent root = FXMLLoader.load(getClass().getResource("/FXML/FenetreMenu.fxml"));
|
||||
Scene scene = new Scene(root);
|
||||
stage.setScene(scene);
|
||||
stage.show();
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package launchers;
|
||||
|
||||
public class ThermometreConsole {
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package models;
|
||||
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
|
||||
public abstract interface Observateur {
|
||||
public abstract void update();
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
package models;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class Sujet {
|
||||
|
||||
private List<Observateur> ListObservateurs = new ArrayList<>();
|
||||
|
||||
|
||||
|
||||
public List<Observateur> getListObservateurs(){
|
||||
return Collections.unmodifiableList(ListObservateurs);
|
||||
}
|
||||
public void ajouterObservateur(Observateur observateur){
|
||||
ListObservateurs.add(observateur);
|
||||
}
|
||||
public void enleverObservateur(Observateur observateur){
|
||||
ListObservateurs.remove(observateur);
|
||||
}
|
||||
public void notifier(){
|
||||
for (Observateur observateur : ListObservateurs){
|
||||
observateur.update();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,55 @@
|
||||
package models;
|
||||
|
||||
import javafx.application.Platform;
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
||||
import models.capteurs.CapteurTemperature;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TachePeriodique extends Thread{
|
||||
|
||||
private CapteurTemperature capteur;
|
||||
protected final BooleanProperty arret = new SimpleBooleanProperty();
|
||||
|
||||
private List<CapteurTemperature> ListCapteurTachePeriodique = new ArrayList<>();
|
||||
|
||||
public TachePeriodique(){
|
||||
setArret(true);
|
||||
}
|
||||
|
||||
|
||||
public BooleanProperty arretProperty(){
|
||||
return arret;
|
||||
}
|
||||
public boolean getArret(){
|
||||
return arret.get();
|
||||
}
|
||||
private void setArret(boolean arret){
|
||||
this.arret.set(arret);
|
||||
|
||||
if(arret){
|
||||
this.start();
|
||||
}
|
||||
}
|
||||
public void ajouterUnCpateurTachePeriodique(CapteurTemperature capteur ){
|
||||
ListCapteurTachePeriodique.add(capteur);
|
||||
}
|
||||
@Override
|
||||
public void run() {
|
||||
while (getArret()) {
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
Platform.runLater(() -> {
|
||||
ListCapteurTachePeriodique.forEach(e -> e.compute());
|
||||
});
|
||||
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package models;
|
||||
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
|
||||
public abstract class Visualisateur {
|
||||
|
||||
protected CapteurTemperatureAbstrait capteur;
|
||||
|
||||
public Visualisateur(CapteurTemperatureAbstrait capteur){
|
||||
this.capteur = capteur;
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package models.capteurs;
|
||||
|
||||
import javafx.beans.property.SimpleStringProperty;
|
||||
import javafx.beans.property.StringProperty;
|
||||
|
||||
public abstract class Capteur {
|
||||
private static int idCourantIncremente = 0;
|
||||
private int id;
|
||||
private StringProperty nom = new SimpleStringProperty();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public Capteur(String nom){
|
||||
this.nom.set(nom);
|
||||
idCourantIncremente += 1;
|
||||
id = idCourantIncremente;
|
||||
}
|
||||
public StringProperty nomProperty(){
|
||||
return nom;
|
||||
}
|
||||
|
||||
public String getNom() {
|
||||
return nom.get();
|
||||
}
|
||||
|
||||
public void setNom(String nom) {
|
||||
this.nom.set(nom);
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
}
|
@ -0,0 +1,73 @@
|
||||
package models.capteurs;
|
||||
|
||||
import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.IntegerProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.beans.property.SimpleIntegerProperty;
|
||||
import javafx.collections.ObservableList;
|
||||
import models.TachePeriodique;
|
||||
import models.generateurs.StrategieTemperatureGenere;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.ChronoUnit;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
|
||||
public class CapteurTemperature extends CapteurTemperatureAbstrait{
|
||||
|
||||
private LocalDateTime updatedTime;
|
||||
|
||||
public CapteurTemperature(String nom, double temperature, StrategieTemperatureGenere strategieGeneration, TachePeriodique tachePeriodique) {
|
||||
super(nom, temperature);
|
||||
setStrategieGeneration(strategieGeneration);
|
||||
setFrequence(1);
|
||||
setenFonctionnementProperty(true);
|
||||
updatedTime = LocalDateTime.now();
|
||||
tachePeriodique.ajouterUnCpateurTachePeriodique(this);
|
||||
}
|
||||
@Override
|
||||
public double getTemperature() {return this.temperature.get();}
|
||||
|
||||
private IntegerProperty frequence = new SimpleIntegerProperty();
|
||||
public IntegerProperty frequenceProperty() {
|
||||
return frequence;
|
||||
}
|
||||
private void setFrequence(int tick) {this.frequence.set(tick);}
|
||||
public int getFrequence() { return frequence.get();}
|
||||
|
||||
private BooleanProperty enFonctionnement = new SimpleBooleanProperty();
|
||||
public BooleanProperty enFonctionnementProperty() {
|
||||
return enFonctionnement;
|
||||
}
|
||||
|
||||
private void setenFonctionnementProperty(boolean activate) {
|
||||
this.enFonctionnement.set(activate);
|
||||
}
|
||||
public boolean getenFonctionnementProperty() { return enFonctionnement.get();}
|
||||
|
||||
|
||||
@Override
|
||||
public ObservableList<CapteurTemperatureAbstrait> getListCapteurs() throws NoSuchMethodException {
|
||||
throw new NoSuchMethodException();
|
||||
}
|
||||
|
||||
private StrategieTemperatureGenere strategieGeneration;
|
||||
|
||||
public StrategieTemperatureGenere getStrategieGeneration() {
|
||||
return strategieGeneration;
|
||||
}
|
||||
|
||||
public void setStrategieGeneration(StrategieTemperatureGenere strategieGeneration) {
|
||||
this.strategieGeneration = strategieGeneration;
|
||||
}
|
||||
|
||||
public void compute() {
|
||||
if(Objects.nonNull(strategieGeneration) && Boolean.TRUE.equals(getenFonctionnementProperty())) {
|
||||
if(ChronoUnit.SECONDS.between(updatedTime, LocalDateTime.now()) >= getFrequence()) {
|
||||
updatedTime = LocalDateTime.now();
|
||||
temperatureProperty().setValue(strategieGeneration.compute(temperatureProperty().getValue()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package models.capteurs;
|
||||
|
||||
import javafx.beans.property.DoubleProperty;
|
||||
import javafx.beans.property.SimpleDoubleProperty;
|
||||
import javafx.collections.ObservableList;
|
||||
|
||||
public abstract class CapteurTemperatureAbstrait extends Capteur{
|
||||
|
||||
protected DoubleProperty temperature = new SimpleDoubleProperty();
|
||||
|
||||
public CapteurTemperatureAbstrait(String nom, double temperature) {
|
||||
super(nom);
|
||||
this.temperature.set(temperature);
|
||||
}
|
||||
public DoubleProperty temperatureProperty(){
|
||||
return temperature;
|
||||
}
|
||||
private void setTemperature(double temperature){
|
||||
this.temperature.set(temperature);
|
||||
}
|
||||
public abstract double getTemperature();
|
||||
public abstract ObservableList<CapteurTemperatureAbstrait> getListCapteurs() throws NoSuchMethodException;
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
package models.capteurs;
|
||||
|
||||
public class CapteurTemperatureManuel extends CapteurTemperature{
|
||||
|
||||
public CapteurTemperatureManuel(String nom, double temperature) {
|
||||
super(nom, temperature, null, null);
|
||||
}
|
||||
public void setTemperature(double temperature){
|
||||
setTemperature(temperature);
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,74 @@
|
||||
package models.capteurs;
|
||||
|
||||
import javafx.beans.property.ListProperty;
|
||||
import javafx.beans.property.SimpleListProperty;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import models.generateurs.GenerateurAleatoire;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class CapteurTemperatureVirtuel extends CapteurTemperatureAbstrait{
|
||||
|
||||
private Map<Integer, List<CapteurTemperatureAbstrait>> ListCapteur = new HashMap<>();
|
||||
private ObservableList<CapteurTemperatureAbstrait> ListCapteurObserve = FXCollections.observableArrayList();
|
||||
public ListProperty<CapteurTemperatureAbstrait> listeCapteur = new SimpleListProperty<>(ListCapteurObserve);
|
||||
|
||||
public CapteurTemperatureVirtuel(String nom, double temperature) {
|
||||
super(nom, temperature);
|
||||
}
|
||||
|
||||
public List<CapteurTemperatureAbstrait> getCapteur(){
|
||||
List<CapteurTemperatureAbstrait> list = new ArrayList<>();
|
||||
for(Map.Entry<Integer, List<CapteurTemperatureAbstrait>> valeur : ListCapteur.entrySet()){
|
||||
valeur.getValue().forEach(list::add);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public void AjouterUnCapteur(CapteurTemperatureAbstrait capteur, Integer poids){
|
||||
if(ListCapteur.containsKey(poids)){
|
||||
ListCapteur.get(poids).add(capteur);
|
||||
ListCapteurObserve.add(capteur);
|
||||
}else {
|
||||
ListCapteur.put(poids, new ArrayList<>());
|
||||
ListCapteur.get(poids).add(capteur);
|
||||
ListCapteurObserve.add(capteur);
|
||||
}
|
||||
}
|
||||
public void supprimerCapteur(CapteurTemperatureAbstrait capteur){
|
||||
ListCapteurObserve.remove(capteur);
|
||||
for(Map.Entry<Integer, List<CapteurTemperatureAbstrait>> valeur : ListCapteur.entrySet()){
|
||||
if(valeur.getValue().contains(capteur)){
|
||||
valeur.getValue().remove(capteur);
|
||||
}
|
||||
}
|
||||
}
|
||||
private double calculMoyenne(){
|
||||
double SommeDesPoids = 0;
|
||||
double SommeDesTemperatures = 0;
|
||||
double Moyenne = 0;
|
||||
for (Map.Entry<Integer, List<CapteurTemperatureAbstrait>> valeur : ListCapteur.entrySet()){
|
||||
for (CapteurTemperatureAbstrait capteur : valeur.getValue()){
|
||||
SommeDesPoids += valeur.getKey();
|
||||
SommeDesTemperatures += (capteur.temperatureProperty().getValue() * valeur.getKey());
|
||||
}
|
||||
}
|
||||
Moyenne = SommeDesTemperatures/SommeDesPoids;
|
||||
return Moyenne;
|
||||
}
|
||||
public void MiseAjourTemperature() {temperatureProperty().setValue(calculMoyenne());}
|
||||
|
||||
@Override
|
||||
public double getTemperature() {
|
||||
return temperatureProperty().getValue();
|
||||
}
|
||||
|
||||
@Override
|
||||
public ObservableList<CapteurTemperatureAbstrait> getListCapteurs() throws NoSuchMethodException {
|
||||
return ListCapteurObserve;
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
package models.generateurs;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class GenerateurAleatoire implements StrategieTemperatureGenere {
|
||||
|
||||
|
||||
@Override
|
||||
public double compute(double temperature) {
|
||||
Random random = new Random();
|
||||
final int minTemperatureEnFrance = -40;
|
||||
final int maxTemeperatureEnFrance = 55;
|
||||
double temperatureGenere;
|
||||
temperatureGenere = minTemperatureEnFrance + random.nextDouble() * (maxTemeperatureEnFrance - minTemperatureEnFrance);
|
||||
return temperatureGenere;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
package models.generateurs;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class GenerateurParVariation implements StrategieTemperatureGenere{
|
||||
private final double valeurVariable;
|
||||
|
||||
public GenerateurParVariation(double valeurVariable) {
|
||||
this.valeurVariable = valeurVariable;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double compute(double temperature) {
|
||||
Random random = new Random();
|
||||
double variation = random.nextDouble() * valeurVariable;
|
||||
int signe = random.nextInt(2);
|
||||
double temperatureGenere;
|
||||
if(signe == 0){
|
||||
temperatureGenere = temperature - variation;
|
||||
}
|
||||
else {
|
||||
temperatureGenere = temperature + variation;
|
||||
}
|
||||
|
||||
if(temperatureGenere < -40){
|
||||
|
||||
return 40;
|
||||
|
||||
} else if (temperatureGenere > 54) {
|
||||
|
||||
return 54;
|
||||
|
||||
}
|
||||
else {
|
||||
return temperatureGenere;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
package models.generateurs;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
public class GeneratureParIntervalle implements StrategieTemperatureGenere{
|
||||
private final double valeurIntervalleMax;
|
||||
private final double valeurIntervalMin;
|
||||
|
||||
public GeneratureParIntervalle(double valMaxInterval, double valMinInterval){
|
||||
valeurIntervalleMax = valMaxInterval;
|
||||
valeurIntervalMin = valMinInterval;
|
||||
}
|
||||
@Override
|
||||
public double compute(double temperature) {
|
||||
double temperatureGenere;
|
||||
Random random = new Random();
|
||||
temperatureGenere = valeurIntervalMin + random.nextDouble() * (valeurIntervalleMax - valeurIntervalMin);
|
||||
return temperatureGenere;
|
||||
}
|
||||
}
|
@ -0,0 +1,5 @@
|
||||
package models.generateurs;
|
||||
|
||||
public interface StrategieTemperatureGenere {
|
||||
abstract double compute(double temperature);
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
package views.cellules;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.TreeCell;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.VBox;
|
||||
import javafx.scene.text.Text;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
import models.capteurs.CapteurTemperatureVirtuel;
|
||||
|
||||
public class CelluleArbre extends TreeCell {
|
||||
|
||||
@FXML
|
||||
private ImageView imageView;
|
||||
@FXML
|
||||
private HBox hBox;
|
||||
@FXML
|
||||
private VBox vBox;
|
||||
|
||||
@FXML
|
||||
private Text nomDuCapteur = new Text();
|
||||
|
||||
@FXML
|
||||
private Text Degretemperature = new Text();
|
||||
|
||||
protected void updateItem(Object item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
if(!empty) {
|
||||
hBox = new HBox();
|
||||
vBox = new VBox();
|
||||
imageView = new ImageView();
|
||||
imageView.setFitWidth(30);
|
||||
imageView.setFitHeight(30);
|
||||
if(item instanceof CapteurTemperatureVirtuel) {
|
||||
imageView.setImage(new Image("/images/multi_captor_icon.png"));
|
||||
} else {
|
||||
imageView.setImage(new Image("/images/captor_icon.png"));
|
||||
}
|
||||
nomDuCapteur.textProperty().bind(((CapteurTemperatureAbstrait)item).nomProperty());
|
||||
Degretemperature.textProperty().bind(((CapteurTemperatureAbstrait)item).temperatureProperty().asString());
|
||||
vBox.getChildren().addAll(nomDuCapteur, Degretemperature);
|
||||
hBox.getChildren().addAll(imageView, vBox);
|
||||
setGraphic(hBox);
|
||||
} else {
|
||||
nomDuCapteur.textProperty().unbind();
|
||||
Degretemperature.textProperty().unbind();
|
||||
setGraphic(null);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,24 @@
|
||||
package views.cellules;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.TableCell;
|
||||
import javafx.scene.text.Text;
|
||||
|
||||
public class CelluleId extends TableCell {
|
||||
|
||||
@FXML
|
||||
Text text;
|
||||
|
||||
protected void updateItem(Object objet, boolean empty){
|
||||
super.updateItem(objet, empty);
|
||||
|
||||
if(!empty) {
|
||||
text = new Text();
|
||||
text.setText(String.valueOf(objet));
|
||||
setGraphic(text);
|
||||
|
||||
} else {
|
||||
setGraphic(null);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
package views.cellules;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.control.TreeCell;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.text.Text;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
import models.capteurs.CapteurTemperatureVirtuel;
|
||||
|
||||
public class CelluleListVue extends TreeCell {
|
||||
|
||||
@FXML
|
||||
ImageView imageView;
|
||||
|
||||
@FXML
|
||||
HBox hBox;
|
||||
|
||||
@FXML
|
||||
private Text idDuCapteur = new Text();
|
||||
|
||||
@FXML
|
||||
private TextField PoidsDuCapteur = new TextField();
|
||||
|
||||
@Override
|
||||
protected void updateItem(Object item, boolean empty) {
|
||||
super.updateItem(item, empty);
|
||||
if(!empty) {
|
||||
hBox = new HBox();
|
||||
imageView = new ImageView();
|
||||
imageView.setFitWidth(30);
|
||||
imageView.setFitHeight(30);
|
||||
if(item instanceof CapteurTemperatureVirtuel) {
|
||||
imageView.setImage(new Image("/images/multi_captor_icon.png"));
|
||||
} else {
|
||||
imageView.setImage(new Image("/images/captor_icon.png"));
|
||||
}
|
||||
|
||||
idDuCapteur.setText(String.valueOf(((CapteurTemperatureAbstrait)item).getId()));
|
||||
hBox.getChildren().addAll(imageView, PoidsDuCapteur, idDuCapteur);
|
||||
setGraphic(hBox);
|
||||
} else {
|
||||
setGraphic(null);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package views.cellules;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.TableCell;
|
||||
import javafx.scene.control.TextField;
|
||||
|
||||
public class CellulePoids extends TableCell {
|
||||
|
||||
@FXML
|
||||
TextField textField;
|
||||
|
||||
protected void updateItem(Object objet, boolean empty){
|
||||
super.updateItem(objet, empty);
|
||||
|
||||
if(!empty) {
|
||||
textField = new TextField();
|
||||
textField.setText("objet.toString()");
|
||||
setGraphic(textField);
|
||||
|
||||
} else {
|
||||
setGraphic(null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package views.cellules;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.TableCell;
|
||||
import javafx.scene.control.TextField;
|
||||
import javafx.scene.control.TreeCell;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import models.capteurs.CapteurTemperatureVirtuel;
|
||||
|
||||
public class CelluleType extends TableCell {
|
||||
|
||||
@FXML
|
||||
ImageView imageView;
|
||||
|
||||
protected void updateItem(Object objet, boolean empty){
|
||||
super.updateItem(objet, empty);
|
||||
|
||||
if(!empty) {
|
||||
imageView = new ImageView();
|
||||
imageView.setFitHeight(25);
|
||||
imageView.setFitWidth(25);
|
||||
if(objet instanceof CapteurTemperatureVirtuel) {
|
||||
imageView.setImage(new Image("/images/multi_captor_icon.png"));
|
||||
} else {
|
||||
imageView.setImage(new Image("/images/captor_icon.png"));
|
||||
}
|
||||
|
||||
setGraphic(imageView);
|
||||
|
||||
} else {
|
||||
setGraphic(null);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
package views.fabriques;
|
||||
|
||||
import javafx.collections.ListChangeListener;
|
||||
import models.capteurs.CapteurTemperature;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
import models.generateurs.StrategieTemperatureGenere;
|
||||
import views.vues.CapteurTemperatureAbstraitVue;
|
||||
|
||||
public class FabriqueVueCapteurTemperatureAbstrait {
|
||||
|
||||
public static CapteurTemperatureAbstraitVue from(CapteurTemperatureAbstrait root) {
|
||||
CapteurTemperatureAbstraitVue retour = new CapteurTemperatureAbstraitVue(root);
|
||||
|
||||
plonger(root, retour);
|
||||
|
||||
try {
|
||||
root.getListCapteurs().addListener(new ListChangeListener<CapteurTemperatureAbstrait>() {
|
||||
@Override
|
||||
public void onChanged(Change<? extends CapteurTemperatureAbstrait> c) {
|
||||
while(c.next()) {
|
||||
c.getAddedSubList().forEach(o -> {
|
||||
retour.getChildren().add(FabriqueVueCapteurTemperatureAbstrait.from(o));
|
||||
});
|
||||
}
|
||||
plonger(root, retour);
|
||||
}
|
||||
});
|
||||
} catch (NoSuchMethodException e) {}
|
||||
|
||||
return retour;
|
||||
}
|
||||
|
||||
public static void plonger(CapteurTemperatureAbstrait root, CapteurTemperatureAbstraitVue retour) {
|
||||
try {
|
||||
root.getListCapteurs().forEach(e -> {
|
||||
retour.getChildren().add(FabriqueVueCapteurTemperatureAbstrait.from(e));
|
||||
});
|
||||
} catch (NoSuchMethodException e) {}
|
||||
|
||||
}
|
||||
}
|
@ -0,0 +1,59 @@
|
||||
package views.fenetre;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.image.Image;
|
||||
import javafx.scene.image.ImageView;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
import models.Visualisateur;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
|
||||
public class FenetreImage extends Visualisateur {
|
||||
|
||||
private final int nuageux = 25;
|
||||
private final int froid = 0;
|
||||
|
||||
|
||||
@FXML
|
||||
private ImageView imageView;
|
||||
|
||||
@FXML
|
||||
private Text nomDuCapteur;
|
||||
|
||||
@FXML
|
||||
private Button bouton;
|
||||
public FenetreImage(CapteurTemperatureAbstrait capteur) {
|
||||
super(capteur);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void boutonFermer() {
|
||||
Stage stage = (Stage) imageView.getScene().getWindow();
|
||||
stage.close();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
private void DetermineImage() {
|
||||
String imageRessource;
|
||||
if(capteur.getTemperature() <= froid) {
|
||||
imageRessource = "froid";
|
||||
} else if (capteur.getTemperature() <= nuageux) {
|
||||
imageRessource = "nuageux";
|
||||
} else {
|
||||
imageRessource = "chaud";
|
||||
}
|
||||
if(imageView.getImage() == null || !imageView.getImage().getUrl().endsWith(imageRessource+".jpg")) {
|
||||
imageView.setImage(new Image("/images/"+imageRessource+".jpg"));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
nomDuCapteur.textProperty().bind(capteur.nomProperty());
|
||||
DetermineImage();
|
||||
capteur.temperatureProperty().addListener((__, ___, newValue) -> DetermineImage());
|
||||
}
|
||||
}
|
@ -0,0 +1,206 @@
|
||||
package views.fenetre;
|
||||
|
||||
import DonneePersistante.Stub;
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ListChangeListener;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.event.ActionEvent;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.fxml.FXMLLoader;
|
||||
import javafx.scene.Parent;
|
||||
import javafx.scene.Scene;
|
||||
import javafx.scene.control.*;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
import models.TachePeriodique;
|
||||
import models.capteurs.CapteurTemperature;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
import models.capteurs.CapteurTemperatureVirtuel;
|
||||
import models.generateurs.GenerateurAleatoire;
|
||||
import models.generateurs.GenerateurParVariation;
|
||||
import models.generateurs.GeneratureParIntervalle;
|
||||
import views.cellules.CelluleArbre;
|
||||
import views.cellules.CelluleId;
|
||||
import views.cellules.CellulePoids;
|
||||
import views.cellules.CelluleType;
|
||||
import views.fabriques.FabriqueVueCapteurTemperatureAbstrait;
|
||||
import java.io.IOException;
|
||||
|
||||
public class FenetreMenu {
|
||||
private CapteurTemperatureAbstrait capteur;
|
||||
|
||||
@FXML
|
||||
private Button boutonDuSlider;
|
||||
|
||||
@FXML
|
||||
private TextField nomDuCapteur;
|
||||
|
||||
@FXML
|
||||
private Text temperature;
|
||||
|
||||
@FXML
|
||||
private Text idDuCpateur;
|
||||
@FXML
|
||||
private TreeView<CapteurTemperatureAbstrait> treeView;
|
||||
|
||||
@FXML
|
||||
private HBox frequence;
|
||||
|
||||
@FXML
|
||||
private HBox strategie;
|
||||
|
||||
@FXML
|
||||
private ComboBox<String> comboBox;
|
||||
|
||||
@FXML
|
||||
private Spinner<Integer> spinner;
|
||||
|
||||
@FXML
|
||||
private ToggleButton toggleButton;
|
||||
@FXML
|
||||
private TableView<CapteurTemperatureAbstrait> tableView;
|
||||
@FXML
|
||||
private TableColumn<CapteurTemperatureAbstrait,Integer> tableId;
|
||||
|
||||
@FXML
|
||||
private TableColumn<ObservableList, ObservableList<Integer>> tablePoids;
|
||||
|
||||
@FXML
|
||||
private TableColumn<ObservableList, ObservableList<CapteurTemperatureAbstrait>> tableType;
|
||||
|
||||
private ObservableList<ObservableList> listeTableView = FXCollections.observableArrayList();
|
||||
|
||||
|
||||
|
||||
@FXML
|
||||
public void boutonSlider() throws IOException {
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/FenetreThermometre.fxml"));
|
||||
loader.setController(new FenetreThermometre(treeView.getSelectionModel().getSelectedItem().getValue()));
|
||||
Parent root = loader.load();
|
||||
Stage stage = new Stage();
|
||||
stage.initOwner(boutonDuSlider.getScene().getWindow());
|
||||
Scene scene = new Scene(root);
|
||||
stage.setScene(scene);
|
||||
stage.show();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void boutonImage(ActionEvent e) throws IOException {
|
||||
FXMLLoader loader = new FXMLLoader(getClass().getResource("/FXML/FenetreImage.fxml"));
|
||||
loader.setController(new FenetreImage(treeView.getSelectionModel().getSelectedItem().getValue()));
|
||||
Parent root = loader.load();
|
||||
Stage stage = new Stage();
|
||||
stage.initOwner(((Button)e.getSource()).getScene().getWindow());
|
||||
Scene scene = new Scene(root);
|
||||
stage.setScene(scene);
|
||||
stage.show();
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void boutonFermer() {
|
||||
Stage stage = (Stage) nomDuCapteur.getScene().getWindow();
|
||||
stage.close();
|
||||
}
|
||||
|
||||
private void MiseAjourCapteur(){
|
||||
if(capteur != null){
|
||||
unbindPropriété();
|
||||
}
|
||||
bindPropriété();
|
||||
updateInfoCapteur();
|
||||
}
|
||||
|
||||
|
||||
private void unbindPropriété(){
|
||||
nomDuCapteur.textProperty().unbindBidirectional(capteur.nomProperty());
|
||||
temperature.textProperty().unbind();
|
||||
if(capteur instanceof CapteurTemperature){
|
||||
toggleButton.selectedProperty().unbindBidirectional(((CapteurTemperature) capteur).enFonctionnementProperty());
|
||||
spinner.getValueFactory().valueProperty().unbindBidirectional(((CapteurTemperature) capteur).frequenceProperty().asObject());
|
||||
}
|
||||
}
|
||||
private void bindPropriété(){
|
||||
capteur = treeView.getSelectionModel().getSelectedItem().getValue();
|
||||
nomDuCapteur.textProperty().bindBidirectional(capteur.nomProperty());
|
||||
temperature.textProperty().bind(capteur.temperatureProperty().asString());
|
||||
idDuCpateur.textProperty().setValue(String.valueOf(capteur.getId()));
|
||||
if(capteur instanceof CapteurTemperature){
|
||||
spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0,60,1));
|
||||
spinner.getValueFactory().valueProperty().bindBidirectional(((CapteurTemperature) capteur).frequenceProperty().asObject());
|
||||
toggleButton.selectedProperty().bindBidirectional(((CapteurTemperature) capteur).enFonctionnementProperty());
|
||||
}
|
||||
}
|
||||
private void updateInfoCapteur(){
|
||||
if(capteur instanceof CapteurTemperature){
|
||||
strategie.setVisible(true);
|
||||
if(((CapteurTemperature) capteur).getStrategieGeneration() != null){
|
||||
|
||||
frequence.setVisible(true);
|
||||
toggleButton.setVisible(true);
|
||||
|
||||
} else {
|
||||
frequence.setVisible(false);
|
||||
toggleButton.setVisible(false);
|
||||
}
|
||||
} else {
|
||||
strategie.setVisible(false);
|
||||
frequence.setVisible(false);
|
||||
toggleButton.setVisible(false);
|
||||
}
|
||||
if(capteur instanceof CapteurTemperatureVirtuel) {
|
||||
|
||||
tableView.setVisible(true);
|
||||
} else {
|
||||
var strat = (((CapteurTemperature) capteur).getStrategieGeneration() != null) ? ((CapteurTemperature) capteur).getStrategieGeneration().toString() : "Manuel";
|
||||
comboBox.getSelectionModel().select(strat);
|
||||
tableView.setVisible(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void ChangementDeStrategie(String strategieGeneration){
|
||||
var capteurTemperature = treeView.getSelectionModel().getSelectedItem().getValue();
|
||||
if(capteurTemperature instanceof CapteurTemperature){
|
||||
if(strategieGeneration.equals("Aléatoire")){
|
||||
((CapteurTemperature) capteurTemperature).setStrategieGeneration(new GenerateurAleatoire());
|
||||
} else if (strategieGeneration.equals("Intervalle")) {
|
||||
((CapteurTemperature) capteurTemperature).setStrategieGeneration(new GeneratureParIntervalle(-40, 55));
|
||||
} else if (strategieGeneration.equals("Variation")) {
|
||||
((CapteurTemperature) capteurTemperature).setStrategieGeneration(new GenerateurParVariation(8));
|
||||
} else if (strategieGeneration.equals("Manuel")) {
|
||||
((CapteurTemperature) capteurTemperature).setStrategieGeneration(null);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
ObservableList<String> listeStratGen = FXCollections.observableArrayList();
|
||||
listeStratGen.add("Aléatoire");
|
||||
listeStratGen.add("Intervalle");
|
||||
listeStratGen.add("Variation");
|
||||
listeStratGen.add("Manuel");
|
||||
|
||||
|
||||
comboBox.setItems(listeStratGen);
|
||||
|
||||
|
||||
treeView.setCellFactory(__ -> new CelluleArbre());
|
||||
tableId.setCellFactory(__ -> new CelluleId());
|
||||
tableType.setCellFactory(__ -> new CelluleType());
|
||||
tablePoids.setCellFactory(__ -> new CellulePoids());
|
||||
|
||||
var TachePeriodique = new TachePeriodique();
|
||||
|
||||
var root = FabriqueVueCapteurTemperatureAbstrait.from(Stub.chargerArbre(TachePeriodique));
|
||||
|
||||
treeView.getSelectionModel().getSelectedItems().addListener((ListChangeListener<TreeItem<CapteurTemperatureAbstrait>>) c -> MiseAjourCapteur());
|
||||
spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0,30,1));
|
||||
comboBox.setOnAction(actionEvent -> ChangementDeStrategie(comboBox.getValue()));
|
||||
treeView.setRoot(root);
|
||||
treeView.setShowRoot(false);
|
||||
toggleButton.setText("arrêter");
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
package views.fenetre;
|
||||
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.scene.control.ListView;
|
||||
import javafx.scene.control.Slider;
|
||||
import javafx.scene.text.Text;
|
||||
import javafx.stage.Stage;
|
||||
import models.Visualisateur;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
|
||||
public class FenetreThermometre extends Visualisateur {
|
||||
|
||||
@FXML
|
||||
private Text valTemperature;
|
||||
|
||||
@FXML
|
||||
private Text nomDuCapteur;
|
||||
|
||||
@FXML
|
||||
private Slider slider;
|
||||
|
||||
@FXML
|
||||
private ListView<CapteurTemperatureAbstrait> listVue;
|
||||
|
||||
|
||||
public FenetreThermometre(CapteurTemperatureAbstrait capteur) {
|
||||
super(capteur);
|
||||
}
|
||||
|
||||
@FXML
|
||||
public void butonFermer(){
|
||||
|
||||
Stage stage = (Stage) slider.getScene().getWindow();
|
||||
stage.close();
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
slider.valueProperty().bindBidirectional(capteur.temperatureProperty());
|
||||
valTemperature.textProperty().bind(capteur.temperatureProperty().asString());
|
||||
nomDuCapteur.textProperty().bind((capteur.nomProperty()));
|
||||
}
|
||||
}
|
@ -0,0 +1,14 @@
|
||||
package views.vues;
|
||||
|
||||
import javafx.scene.control.TreeItem;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
|
||||
public class CapteurTemperatureAbstraitVue extends TreeItem<CapteurTemperatureAbstrait> {
|
||||
|
||||
protected CapteurTemperatureAbstrait capteurTemperatureAbstrait;
|
||||
|
||||
public CapteurTemperatureAbstraitVue(CapteurTemperatureAbstrait capteur) {
|
||||
super(capteur);
|
||||
capteurTemperatureAbstrait = capteur;
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
package views.vues;
|
||||
|
||||
import javafx.collections.FXCollections;
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.scene.control.TreeItem;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
|
||||
public class CapteurTemperatureVirtuelVue extends CapteurTemperatureAbstraitVue{
|
||||
|
||||
private ObservableList<TreeItem<CapteurTemperatureAbstrait>> observableListCapteurtemperatureAbstrait = FXCollections.observableArrayList();
|
||||
|
||||
public CapteurTemperatureVirtuelVue(CapteurTemperatureAbstrait capteur) {
|
||||
super(capteur);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ObservableList<TreeItem<CapteurTemperatureAbstrait>> getChildren() {
|
||||
System.out.println(observableListCapteurtemperatureAbstrait.stream().count());
|
||||
return observableListCapteurtemperatureAbstrait;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
package views.vues;
|
||||
|
||||
import javafx.collections.ObservableList;
|
||||
import javafx.scene.control.TreeItem;
|
||||
import models.capteurs.CapteurTemperatureAbstrait;
|
||||
|
||||
public class CapteurTemperatureVue extends CapteurTemperatureAbstraitVue{
|
||||
|
||||
public CapteurTemperatureVue(CapteurTemperatureAbstrait capteur) {
|
||||
|
||||
super(capteur);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isLeaf() {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ObservableList<TreeItem<CapteurTemperatureAbstrait>> getChildren() {
|
||||
|
||||
throw new RuntimeException();
|
||||
}
|
||||
}
|