From 70e583a380b3d1407983777cc2c3658e5ba709e9 Mon Sep 17 00:00:00 2001 From: Emi Boucly Date: Mon, 17 Mar 2025 11:14:27 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20d=C3=A9but=20environnement=20graphique,?= =?UTF-8?q?=20dessin=20fonctionnel,=20sauvegarde=20et=20chargement=20tempo?= =?UTF-8?q?raire=20possible?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- graphical-app/pom.xml | 8 +- .../emiko/graphicalapp/HelloApplication.java | 2 +- .../emiko/graphicalapp/HelloController.java | 98 +++++++++++++++++-- .../java/fr/emiko/graphicsElement/Stroke.java | 39 ++++++++ graphical-app/src/main/java/module-info.java | 2 + .../fr/emiko/graphicalapp/hello-view.fxml | 65 +++++++++--- 6 files changed, 195 insertions(+), 19 deletions(-) create mode 100644 graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java diff --git a/graphical-app/pom.xml b/graphical-app/pom.xml index a1db254..fef568a 100644 --- a/graphical-app/pom.xml +++ b/graphical-app/pom.xml @@ -36,7 +36,13 @@ junit-jupiter-engine ${junit.version} test - + + + org.controlsfx + controlsfx + 11.2.1 + + diff --git a/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloApplication.java b/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloApplication.java index 3ed2999..649b3e6 100644 --- a/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloApplication.java +++ b/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloApplication.java @@ -12,7 +12,7 @@ public class HelloApplication extends Application { public void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(HelloApplication.class.getResource("hello-view.fxml")); Scene scene = new Scene(fxmlLoader.load(), 320, 240); - stage.setTitle("Hello!"); + stage.setTitle("PixelWriter"); stage.setScene(scene); stage.show(); } diff --git a/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java b/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java index 63b4e52..5cfca8a 100644 --- a/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java +++ b/graphical-app/src/main/java/fr/emiko/graphicalapp/HelloController.java @@ -1,14 +1,100 @@ package fr.emiko.graphicalapp; +import javafx.application.Platform; +import javafx.event.ActionEvent; import javafx.fxml.FXML; +import javafx.fxml.Initializable; +import javafx.scene.SnapshotParameters; +import javafx.scene.canvas.Canvas; import javafx.scene.control.Label; +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.control.MenuItem; +import javafx.scene.image.PixelReader; +import javafx.scene.image.PixelWriter; +import javafx.scene.image.WritableImage; +import javafx.scene.input.MouseEvent; +import javafx.scene.paint.Color; +import javafx.scene.paint.Paint; +import fr.emiko.graphicsElement.Stroke; -public class HelloController { - @FXML - private Label welcomeText; +import java.awt.*; +import java.net.URL; +import java.util.ResourceBundle; +import java.util.Vector; - @FXML - protected void onHelloButtonClick() { - welcomeText.setText("Welcome to JavaFX Application!"); +public class HelloController implements Initializable { + public Canvas drawingCanvas; + public MenuItem saveButton; + public MenuItem loadButton; + public MenuItem newCanvasButton; + private double posX = 0; + private double posY = 0; + private Vector strokes = new Vector<>(); + private Vector lastSaved = new Vector<>(); + + @Override + public void initialize(URL url, ResourceBundle resourceBundle) { + drawingCanvas.setOnMouseDragged(this::printLine); + drawingCanvas.setOnMouseClicked(this::resetPos); + saveButton.setOnAction(this::onActionSave); + loadButton.setOnAction(this::onActionLoad); + newCanvasButton.setOnAction(this::onActionCreateCanvas); } + + private void onActionCreateCanvas(ActionEvent actionEvent) { + } + + private void onActionLoad(ActionEvent actionEvent) { +// drawingCanvas.getGraphicsContext2D().drawImage(lastSaved, 0, 0); + GraphicsContext gc = drawingCanvas.getGraphicsContext2D(); + gc.clearRect(0, 0, drawingCanvas.getWidth(), drawingCanvas.getHeight()); + for (Stroke stroke : lastSaved) { + stroke.draw(gc); + } + strokes = (Vector) lastSaved.clone(); + } + + private void onActionSave(ActionEvent actionEvent) { + GraphicsContext gc = drawingCanvas.getGraphicsContext2D(); + lastSaved = (Vector) strokes.clone(); + + } + + private void resetPos(MouseEvent mouseEvent) { + posX = 0; + posY = 0; + } + + private void printLine(MouseEvent mouseEvent) { + GraphicsContext gc = drawingCanvas.getGraphicsContext2D(); +// gc.setFill(Color.BLACK); +// gc.setStroke(Color.BLACK); +// gc.beginPath(); +// if (posX == 0 || posY == 0) { +// posX = mouseEvent.getX(); +// posY = mouseEvent.getY(); +// } +// gc.moveTo(posX, posY); +// gc.lineTo(mouseEvent.getX(), mouseEvent.getY()); +// gc.closePath(); +// gc.stroke(); +// posX = mouseEvent.getX(); +// posY = mouseEvent.getY(); + + if (posX == 0 || posY == 0) { + posX = mouseEvent.getX(); + posY = mouseEvent.getY(); + } + + Stroke stroke = new Stroke(posX, posY, mouseEvent.getX(), mouseEvent.getY()); + strokes.add(stroke); + stroke.draw(gc); + + posX = mouseEvent.getX(); + posY = mouseEvent.getY(); + + System.out.println(stroke); + + } + } \ No newline at end of file diff --git a/graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java b/graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java new file mode 100644 index 0000000..eb509b4 --- /dev/null +++ b/graphical-app/src/main/java/fr/emiko/graphicsElement/Stroke.java @@ -0,0 +1,39 @@ +package fr.emiko.graphicsElement; + +import javafx.scene.canvas.GraphicsContext; +import javafx.scene.shape.Path; + +import java.awt.*; + +public class Stroke { + private final double fromX; + private final double fromY; + private final double toX; + private final double toY; + + public Stroke (double fromX, double fromY, double toX, double toY) { + this.fromX = fromX; + this.fromY = fromY; + this.toX = toX; + this.toY = toY; + } + + public void draw (GraphicsContext g) { +// g.setStroke(javafx.scene.paint.Color.BLACK); +// g.setLineWidth(1); +// g.beginPath(); +// g.moveTo(fromX, fromY); +// g.lineTo(toX, toY); +// g.closePath(); +// g.stroke(); +// g.fill(); + + g.setFill(javafx.scene.paint.Color.BLACK); + g.fillOval(toX-5, toY-5, 10, 10); + } + + @Override + public String toString () { + return "Stroke{fromX=%f, fromY=%f, toX=%f, toY=%f}".formatted(fromX, fromY, toX, toY); + } +} diff --git a/graphical-app/src/main/java/module-info.java b/graphical-app/src/main/java/module-info.java index 2311359..0e41edb 100644 --- a/graphical-app/src/main/java/module-info.java +++ b/graphical-app/src/main/java/module-info.java @@ -1,6 +1,8 @@ module fr.emiko.graphicalapp { requires javafx.controls; requires javafx.fxml; + requires java.desktop; + requires org.controlsfx.controls; opens fr.emiko.graphicalapp to javafx.fxml; diff --git a/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml b/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml index d15ac55..8ce89a8 100644 --- a/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml +++ b/graphical-app/src/main/resources/fr/emiko/graphicalapp/hello-view.fxml @@ -1,16 +1,59 @@ - - + + + + + + + + + - - - - - - -