Skip to content
Snippets Groups Projects
Commit 0505ca3f authored by dylan.peiry's avatar dylan.peiry
Browse files

Merge branch 'dev' into 'main'

feat(sprint1): first minor version release

See merge request !9
parents 2407ca86 3396aab8
No related branches found
No related tags found
1 merge request!9feat(sprint1): first minor version release
Showing
with 482 additions and 92 deletions
......@@ -54,6 +54,7 @@ dkms.conf
# Personal remove
.vscode/
.idea/
.DS_Store/
# Maven
......@@ -81,5 +82,4 @@ buildNumber.properties
# intellij
*.iml
# End of https://www.toptal.com/developers/gitignore/api/maven
\ No newline at end of file
# End of https://www.toptal.com/developers/gitignore/api/maven
......@@ -139,4 +139,35 @@ mvn -version
Run program with maven :
```console
mvn clean javafx:run
```
\ No newline at end of file
```
## Create a branch and push it
```console
git checkout -b [branchName] [baseBranch=dev]
```
```console
git commit -m "[commitMessage]"
```
```console
git commit --allow-empty -m "[commitMessage]"
```
```console
git push origin [branchName]
```
---
---
# Présentation Sprint 1
- Introduire le sujet (Maxence) -> gestion des branches avec git
- Montrer les objectifs du sprint 1 (Maxence) BACKLOG
- Présenter ce qui est fonctionnel :
- Map (Dylan)
- Markers (Scott)
- Scene (John)
- Profile (Niko)
- Conclution (Damian)
\ No newline at end of file
......@@ -68,6 +68,11 @@
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-web</artifactId>
<version>17.0.1</version>
</dependency>
</dependencies>
<build>
......
package ch.dreamteam.geoconnect;
import ch.dreamteam.geoconnect.controllers.SceneController;
import ch.dreamteam.geoconnect.helpers.Params;
import com.dlsc.gmapsfx.GoogleMapView;
import com.dlsc.gmapsfx.MapComponentInitializedListener;
import com.dlsc.gmapsfx.javascript.object.*;
import com.dlsc.gmapsfx.service.directions.DirectionStatus;
import com.dlsc.gmapsfx.service.directions.DirectionsResult;
import com.dlsc.gmapsfx.service.directions.DirectionsServiceCallback;
import com.dlsc.gmapsfx.service.elevation.ElevationResult;
import com.dlsc.gmapsfx.service.elevation.ElevationServiceCallback;
import com.dlsc.gmapsfx.service.elevation.ElevationStatus;
import com.dlsc.gmapsfx.service.geocoding.GeocoderStatus;
import com.dlsc.gmapsfx.service.geocoding.GeocodingResult;
import com.dlsc.gmapsfx.service.geocoding.GeocodingServiceCallback;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.web.WebEvent;
import javafx.stage.Stage;
import javafx.util.Pair;
import netscape.javascript.JSObject;
import java.io.IOException;
import java.lang.reflect.Array;
import java.net.URL;
import java.util.ArrayList;
public class MainApplication extends Application implements MapComponentInitializedListener, ElevationServiceCallback, GeocodingServiceCallback, DirectionsServiceCallback {
protected static GoogleMapView mapComponent;
protected GoogleMap map;
protected DirectionsPane directions;
public class MainApplication extends Application {
public static void main(String[] args) {
launch(args);
}
public static GoogleMapView getMapComponent() {
return mapComponent;
}
@Override
public void start(Stage primaryStage) throws IOException {
initializeMapComponent();
String defaultScene = "map";
SceneController.initStageAndScenes(primaryStage, defaultScene);
/*Load FXML file*/
FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("views/home-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 1400, 900);
primaryStage.setTitle(Params.APP_NAME);
primaryStage.setScene(scene);
SceneController.loadScene(defaultScene);
primaryStage.show();
}
private void initializeMapComponent() {
mapComponent = new GoogleMapView(null, "AIzaSyBME8EFus9n7fjurdqU3Bsm1Y-BfgroA2o");
mapComponent.addMapInitializedListener(this);
mapComponent.setDisableDoubleClick(true);
mapComponent.getWebview().getEngine().setOnAlert((WebEvent<String> event) -> System.out.println("Event event: " + event));
}
@Override
public void mapInitialized() {
LatLong center = new LatLong(46.2050242, 6.1090692);
mapComponent.addMapReadyListener(() -> {
// This call will fail unless the map is completely ready.
//checkCenter(center);
});
MapOptions options = new MapOptions();
options.center(center)
.zoom(13)
.overviewMapControl(true)
.panControl(true)
.rotateControl(true)
.scaleControl(true)
.streetViewControl(true)
.zoomControl(true)
.mapType(MapTypeIdEnum.ROADMAP);
map = mapComponent.createMap(options);
map.setHeading(123.2);
}
@Override
public void directionsReceived(DirectionsResult results, DirectionStatus status) {
}
@Override
public void elevationsReceived(ElevationResult[] results, ElevationStatus status) {
}
@Override
public void geocodedResultsReceived(GeocodingResult[] results, GeocoderStatus status) {
}
}
package ch.dreamteam.geoconnect.controllers;
import ch.dreamteam.geoconnect.MainApplication;
import com.dlsc.gmapsfx.GoogleMapView;
import com.dlsc.gmapsfx.MapComponentInitializedListener;
import com.dlsc.gmapsfx.javascript.event.UIEventType;
import com.dlsc.gmapsfx.javascript.object.*;
import com.dlsc.gmapsfx.util.MarkerImageFactory;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEvent;
import netscape.javascript.JSObject;
import org.kordamp.ikonli.javafx.FontIcon;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
public class MainController implements Initializable {
public class MainController implements Initializable, MapComponentInitializedListener {
protected GoogleMapView mapComponent;
protected GoogleMap map;
@FXML
private HBox iconsContainer;
@FXML
......@@ -23,13 +34,93 @@ public class MainController implements Initializable {
@FXML
private VBox menuContainer;
@FXML
public VBox userProfilContainer;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
System.out.println("initialize");
GoogleMapView mapComponent = MainApplication.getMapComponent();
initializeMapComponent();
//mapComponent.setPrefSize(mapContainer.getWidth(), mapContainer.getHeight());
mapComponent.setPrefHeight(mapContainer.getPrefHeight());
mapComponent.setPrefWidth(mapContainer.getPrefWidth());
mapContainer.getChildren().add(mapComponent);
}
private void initializeMapComponent() {
mapComponent = new GoogleMapView(null, "AIzaSyBME8EFus9n7fjurdqU3Bsm1Y-BfgroA2o");
mapComponent.addMapInitializedListener(this);
mapComponent.setDisableDoubleClick(true);
mapComponent.getWebview().getEngine().setOnAlert((WebEvent<String> event) -> System.out.println("Event event: " + event));
}
@Override
public void mapInitialized() {
LatLong center = new LatLong(46.2050242, 6.1090692);
ArrayList<LatLong> coordonates = new ArrayList<>();
coordonates.add(new LatLong(46.2050242, 6.1090692));
coordonates.add(new LatLong(46.2066136,6.1499329));
mapComponent.addMapReadyListener(() -> {
Integer index = 1;
for(LatLong coordonate : coordonates) {
Marker m = addMarker(coordonate, index);
map.addUIEventHandler(m, UIEventType.click, (JSObject o)->{
System.out.println("CLICK USER" + m.getTitle());
displayProfile();
});
index++;
}
});
MapOptions options = new MapOptions();
options.center(center)
.zoom(13)
.overviewMapControl(true)
.panControl(true)
.rotateControl(true)
.scaleControl(true)
.streetViewControl(true)
.zoomControl(true)
.mapType(MapTypeIdEnum.ROADMAP);
map = mapComponent.createMap(options);
map.setHeading(123.2);
}
public void handleOnMouseClicked(javafx.scene.input.MouseEvent mouseEvent) {
String id = ((FontIcon) mouseEvent.getSource()).getId();
System.out.println(id);
System.out.println(SceneController.getCurrentScene());
try {
if (id.equals("profileIcon") && !SceneController.getCurrentScene().equals("profile")) {
SceneController.loadScene("profile");
} else if (id.equals("mapIcon") && !SceneController.getCurrentScene().equals("map")) {
SceneController.loadScene("map");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public Marker addMarker(LatLong coordinates, Integer idUser) {
MarkerOptions options = new MarkerOptions();
String iconPath = MarkerImageFactory.createMarkerImage("./user-marker.png", "png");
options.icon(iconPath)
.title("Id:"+idUser)
.position(coordinates);
Marker marker = new Marker(options);
this.map.addMarker(marker);
return marker;
}
public void displayProfile() {
userProfilContainer.setVisible(true);
}
public void hiddeProfile() {
userProfilContainer.setVisible(false);
}
}
\ No newline at end of file
package ch.dreamteam.geoconnect.controllers;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.DatePicker;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import org.kordamp.ikonli.javafx.FontIcon;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.time.LocalDate;
import java.util.List;
import java.util.ResourceBundle;
public class ProfileController implements Initializable {
// ATTRIBUTES
private String name;
private String surname;
private LocalDate birthday;
private Image profilePic;
private ObservableList<String> interests;
// COMPONENTS
// FXML ids must be the exact same as written below
@FXML private TextField tfName;
@FXML private TextField tfSurname;
@FXML private ImageView ivProfileImg;
@FXML private ListView<String> lvInterests;
@FXML private DatePicker dpBirthday;
@FXML private Button btnSubmitModifications;
@FXML private Button btnCancelModifications;
@FXML private Button btnActivateModification;
private void initComponents() {
// TODO: setup data source
name = "Jean";
surname = "Charles";
birthday = LocalDate.of(1997, 1, 9);
File file = new File("/home/eldado/HEPIA/PJO/geoconnect/src/main/resources/ch/dreamteam/geoconnect/images/profile-pic-example.jpg"); // only used for the example
profilePic = new Image(file.toURI().toString());
interests = FXCollections.observableArrayList("Pêche", "Fôtbale", "MEPORG", "HTML5", "Pétanque");
tfName.setText(name);
tfName.setEditable(false);
tfName.setDisable(false);
tfSurname.setText(surname);
tfSurname.setEditable(false);
tfSurname.setDisable(false);
ivProfileImg.setImage(profilePic);
dpBirthday.setValue(birthday);
dpBirthday.setEditable(false);
//TODO: implement interests
lvInterests.getItems().setAll(interests);
}
private void setEditMode() {
tfName.setEditable(true);
tfName.setDisable(false);
tfSurname.setEditable(true);
tfSurname.setDisable(false);
//tfSurname.setEditable(true);
//ImageView to implement
//HBox to implement
dpBirthday.setDisable(false);
btnActivateModification.setDisable(true);
btnActivateModification.setVisible(false);
btnSubmitModifications.setDisable(false);
btnSubmitModifications.setVisible(true);
btnCancelModifications.setDisable(false);
btnCancelModifications.setVisible(true);
}
public void handleOnMouseClicked(javafx.scene.input.MouseEvent mouseEvent) {
String id = ((FontIcon) mouseEvent.getSource()).getId();
System.out.println(id);
System.out.println(SceneController.getCurrentScene());
try {
if (id.equals("profileIcon") && !SceneController.getCurrentScene().equals("profile")) {
SceneController.loadScene("profile");
} else if (id.equals("mapIcon") && !SceneController.getCurrentScene().equals("map")) {
SceneController.loadScene("map");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void setReadMode() {
tfName.setEditable(false);
tfSurname.setEditable(false);
//TODO: implement ImageView picker
//TODO: implement HBox edition
dpBirthday.setDisable(true);
dpBirthday.getEditor().setStyle("-fx-opacity: 1");
btnActivateModification.setDisable(false);
btnActivateModification.setVisible(true);
btnSubmitModifications.setDisable(true);
btnSubmitModifications.setVisible(false);
btnCancelModifications.setDisable(true);
btnCancelModifications.setVisible(false);
}
private void saveModifications() {
name = tfName.getText();
birthday = dpBirthday.getValue();
//TODO: implement interests update
//TODO: implement image update
}
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
System.out.println("initialize profile");
initComponents();
setReadMode();
btnActivateModification.setOnAction(actionEvent -> setEditMode());
//TODO: implement buttons behaviour
btnSubmitModifications.setOnAction(actionEvent -> {
saveModifications();
//System.out.println(name + " " + surname + " " + birthday + " added as new infos");
setReadMode();
});
btnCancelModifications.setOnAction(actionEvent -> {
initComponents();
setReadMode();
});
}
}
package ch.dreamteam.geoconnect.controllers;
import ch.dreamteam.geoconnect.MainApplication;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
public class SceneController {
private static Stage currentStage;
private static HashMap<String, URL> scenes;
private static String currentScene;
public static String getCurrentScene() {
return currentScene;
}
public static void initStageAndScenes(Stage stage, String defaultScene) {
currentStage = stage;
scenes = new HashMap<>();
scenes.put("map", MainApplication.class.getResource("views/home-view.fxml"));
scenes.put("profile", MainApplication.class.getResource("views/profile-view.fxml"));
currentScene = defaultScene;
}
public static void loadScene(String sceneName) throws IOException {
URL sceneUrl = scenes.get(sceneName);
if (sceneUrl == null) {
return;
}
currentScene = sceneName;
FXMLLoader fxmlLoader = new FXMLLoader(sceneUrl);
Scene scene = new Scene(fxmlLoader.load(), 1400, 900);
currentStage.setScene(scene);
}
}
src/main/java/ch/dreamteam/geoconnect/controllers/user-marker.png

5.23 KiB

......@@ -8,6 +8,7 @@ module ch.dreamteam.geoconnect {
requires com.dlsc.gmapsfx;
requires javafx.web;
requires org.kordamp.ikonli.fontawesome5;
requires jdk.jsobject;
opens ch.dreamteam.geoconnect to javafx.fxml;
exports ch.dreamteam.geoconnect;
......
......@@ -5,4 +5,10 @@
.active {
-fx-icon-color: black;
}
.main-vbox {
-fx-pref-width: 960px;
-fx-pref-height: 540px;
-fx-background-color: blue;
}
\ No newline at end of file
src/main/resources/ch/dreamteam/geoconnect/images/profile-pic-example.jpg

173 KiB

src/main/resources/ch/dreamteam/geoconnect/img/user-marker.png

5.23 KiB

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import org.kordamp.ikonli.javafx.FontIcon?>
<AnchorPane prefHeight="900.0" prefWidth="1400.0" xmlns="http://javafx.com/javafx/11.0.14-internal"
xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.dreamteam.geoconnect.controllers.MainController"
stylesheets="@../css/style.css">
<VBox fx:id="container" layoutX="14.0" layoutY="47.0" prefHeight="900.0" prefWidth="1400.0"
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0"
AnchorPane.topAnchor="0.0">
<VBox fx:id="mapContainer" prefHeight="850.0" prefWidth="1400.0"/>
<?import org.kordamp.ikonli.javafx.*?>
<AnchorPane prefHeight="900.0" prefWidth="1400.0" stylesheets="@../css/style.css" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.dreamteam.geoconnect.controllers.MainController">
<VBox fx:id="container" layoutX="14.0" layoutY="47.0" prefHeight="900.0" prefWidth="1400.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<VBox fx:id="mapContainer" prefHeight="850.0" prefWidth="1400.0" />
<VBox fx:id="menuContainer" prefHeight="50.0" prefWidth="1400.0">
<HBox fx:id="iconsContainer" alignment="CENTER" spacing="15" style="-fx-padding: 5 15 5 15">
<FontIcon styleClass="icon" iconLiteral="fas-map-marker-alt" iconSize="32" iconColor="#99b0ff"/>
<FontIcon styleClass="icon,active" iconLiteral="far-user-circle" iconSize="32" iconColor="#99b0ff"/>
<FontIcon fx:id="mapIcon" iconColor="#99b0ff" iconLiteral="fas-map-marker-alt" iconSize="32" styleClass="icon" onMouseClicked="#handleOnMouseClicked"/>
<FontIcon fx:id="profileIcon" iconColor="#99b0ff" iconLiteral="far-user-circle" iconSize="32" styleClass="icon,active" onMouseClicked="#handleOnMouseClicked"/>
</HBox>
</VBox>
</VBox>
<VBox fx:id="userProfilContainer" prefHeight="850.0" prefWidth="400.0" style="-fx-background-color: white;" visible="false" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
<children>
<Button text="Close" onMouseClicked="#hiddeProfile"/>
<ImageView fx:id="imageProfil" fitHeight="200.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true"/>
<Label text="Birner Scott" textAlignment="CENTER"/>
<Label text="HEPIA" />
<Label text="Informatique" />
</children></VBox>
</AnchorPane>
<?xml version="1.0" encoding="UTF-8"?>
<!--
Copyright (c) 2015, 2019, Gluon and/or its affiliates.
All rights reserved. Use is subject to license terms.
This file is available and licensed under the following license:
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in
the documentation and/or other materials provided with the distribution.
- Neither the name of Oracle Corporation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-->
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.image.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>
<?import org.kordamp.ikonli.javafx.*?>
<VBox stylesheets="@../css/style.css" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="800.0" prefWidth="1280.0" xmlns="http://javafx.com/javafx/16" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.dreamteam.geoconnect.controllers.ProfileController">
<children>
<SplitPane focusTraversable="true" prefHeight="-1.0" prefWidth="-1.0" VBox.vgrow="ALWAYS">
<items>
<AnchorPane prefHeight="682.0" prefWidth="1278.0">
<children>
<ImageView id="ivProfileImg" fx:id="ivProfileImg" cache="true" fitHeight="244.0" fitWidth="200.0" layoutX="90.0" layoutY="23.0" pickOnBounds="true" preserveRatio="true" />
<Label layoutX="25.0" layoutY="304.0" text="Nom" HBox.hgrow="ALWAYS">
<font>
<Font size="15.0" />
</font>
</Label>
<TextField id="tfName" fx:id="tfName" alignment="CENTER" layoutX="161.0" layoutY="300.0">
<font>
<Font size="15.0" />
</font>
</TextField>
<Label layoutX="25.0" layoutY="354.0" text="Prénom" HBox.hgrow="ALWAYS">
<font>
<Font size="15.0" />
</font>
</Label>
<TextField id="tfSurname" fx:id="tfSurname" alignment="CENTER" layoutX="161.0" layoutY="350.0">
<font>
<Font size="15.0" />
</font>
</TextField>
<Label layoutX="25.0" layoutY="399.0" text="Date de naissance" HBox.hgrow="ALWAYS">
<font>
<Font size="15.0" />
</font>
</Label>
<DatePicker id="dpBirthday" fx:id="dpBirthday" editable="false" layoutX="163.0" layoutY="396.0" prefHeight="32.0" prefWidth="183.0" promptText="30.04.1998" />
<Label layoutX="25.0" layoutY="449.0" text="Intérêts" HBox.hgrow="ALWAYS">
<font>
<Font size="15.0" />
</font>
</Label>
<Button id="btnSubmitModifications" fx:id="btnSubmitModifications" layoutX="275.0" layoutY="621.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="71.0" text="Valider" />
<Button id="btnCancelModifications" fx:id="btnCancelModifications" layoutX="163.0" layoutY="621.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="71.0" text="Annuler" />
<Button id="btnActivateModification" fx:id="btnActivateModification" layoutX="190.0" layoutY="663.0" mnemonicParsing="false" prefHeight="25.0" prefWidth="125.0" text="Editer le profil" />
<ListView id="lvInterests" fx:id="lvInterests" layoutX="161.0" layoutY="449.0" prefHeight="143.0" prefWidth="186.0" />
</children>
</AnchorPane>
</items>
</SplitPane>
<VBox fx:id="menuContainer" prefHeight="50.0" prefWidth="1400.0">
<HBox fx:id="iconsContainer" alignment="CENTER" spacing="15" style="-fx-padding: 5 15 5 15">
<FontIcon fx:id="mapIcon" iconColor="#99b0ff" iconLiteral="fas-map-marker-alt" iconSize="32" onMouseClicked="#handleOnMouseClicked" styleClass="icon" />
<FontIcon fx:id="profileIcon" iconColor="#99b0ff" iconLiteral="far-user-circle" iconSize="32" onMouseClicked="#handleOnMouseClicked" styleClass="icon,active" />
</HBox>
</VBox>
</children>
</VBox>
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns:fx="http://javafx.com/fxml"
xmlns="http://javafx.com/javafx"
prefHeight="400.0" prefWidth="600.0">
<Label text="Salut a tous"/>
</AnchorPane>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment