Добавить функциональность FreeHand в JavaFX - PullRequest
1 голос
/ 09 февраля 2020

На самом деле я делаю приложение, которое позволяет пользователю обрезать изображение, а затем предоставляет функции рисования от руки, а также рисовать различные формы. Я достиг функциональности кадрирования и рисования таких фигур, как line et c. Но я сталкиваюсь с некоторыми проблемами при рисовании от руки.

Я добавил свое изображение в «HBox» и обрезал это изображение через «Rectangle» в классе JavaFX, который добавлен в «Group». И все это добавлено в класс "Pane". Теперь для рисования от руки я использую «Холст». Куда добавить холст, будь то класс "HBox", "Группа" или "Панель". И Canvas инициализируется только при нажатии кнопки карандаша. Я добавил отдельные функции для Mouse-Events и применил проверки if для различных функций в этих функциях. в основном, как рисовать карандашом на изображении или как добавить линию для группы. Может кто-нибудь помочь мне в решении моей проблемы ??
`

    package application;

import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Point2D;
import javafx.scene.Cursor;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.WritableImage;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Line;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.Rectangle;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

public class Main extends Application {

    int dragStatus = 0;
    double startingPointX;
    double startingPointY;
    double currentEndingPointX;
    double currentEndingPointY;
    BufferedImage bufferedImage;
    Robot robot;
    ImageView imageView;
    Button  pencilBtn;
    Image image;
    Pane rootPane;
    HBox pictureRegion;
    Scene scene;
    Rectangle croppedArea;
    Canvas canvas;
    GraphicsContext gc;
    WritableImage writableImage;
    Group group = new Group();
    Line line;
    LineTo lineTo;
    String shape;
    Boolean canvasAdded;

    @Override
    public void start(Stage primaryStage) {
        try {
            int sleepTime = 120;
            Thread.sleep(sleepTime);
            pencilBtn = createButton("save.png");
            pictureRegion = new HBox();
            rootPane = new Pane();
            scene = new Scene(rootPane);
            robot = new Robot();
            java.awt.Rectangle capture = new java.awt.Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
            bufferedImage = robot.createScreenCapture(capture);
            image = ConvertBufferedToJavaFXImage.convertToFxImage(bufferedImage);
            pencilBtn.setOnAction(e -> geometrySelection("pencil"));
            croppedArea = new Rectangle();
            if(canvas != null) {
                canvas.setOnMousePressed(e -> onMousePressed(e));
                canvas.setOnMousePressed(e -> onMouseDragged(e));
            }
            imageView = new ImageView(image);
            scene.setOnMouseEntered(e -> onMouseEntered(e, "scene"));
            scene.setOnMousePressed(e -> onMousePressed(e));
            scene.setOnMouseReleased(e -> onMouseReleased(e));
            scene.setOnMouseDragged(e -> onMouseDragged(e));
            pictureRegion.getChildren().add(imageView);
            rootPane.getChildren().add(pictureRegion);
            rootPane.getChildren().add(group);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setMaximized(true);
            primaryStage.setScene(scene);
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public void onMouseEntered(MouseEvent ev, String nodeType) {
        if (nodeType == "scene") {
            scene.setCursor(Cursor.CROSSHAIR);
        } else if (nodeType == "croppedArea") {
            croppedArea.setCursor(Cursor.TEXT);
            //croppedArea.setOnMousePressed(e -> onMousePressed(e));
        } else if (nodeType == "btn") {
            pencilBtn.setCursor(Cursor.HAND);
        }
    }

    public void onMousePressed(MouseEvent event) {
        if ((startingPointX < event.getX() && event.getX() < currentEndingPointX)
                && (startingPointY < event.getY() && event.getY() < currentEndingPointY)) {
 if(shape == "pencil") {
                lineTo = new LineTo();
                System.out.println("lineTo1");
                gc.beginPath();
                gc.lineTo(event.getX(), event.getY());
                gc.stroke();
            }
        } else {
            shape = "croppedArea";
            rootPane.getChildren().remove(canvas);
            group.getChildren().clear();
            startingPointX = event.getX();
            startingPointY = event.getY();
            group.getChildren().add(croppedArea);
        }
    }

    public void onMouseDragged(MouseEvent event) {
        dragStatus = 1;
        if (dragStatus == 1) {
//          if((startingPointX < event.getX() && event.getX() < currentEndingPointX)
//                  && (startingPointY < event.getY() && event.getY() < currentEndingPointY)) {
             if(shape == "pencil") {

                System.out.println("lineTo1");
                gc.lineTo(event.getX(), event.getY());
                gc.stroke();
            }
            else {
                currentEndingPointX = event.getX();
                currentEndingPointY = event.getY();
                rootPane.getChildren().remove(pencilBtn);
                croppedArea.setFill(Color.TRANSPARENT);
                croppedArea.setStroke(Color.BLACK);
                croppedArea.setOnMouseEntered(e -> onMouseEntered(e, "croppedArea"));
                adjustRectangleProperties(startingPointX, startingPointY, currentEndingPointX, currentEndingPointY,
                        croppedArea);
            }
        }
    }

    public void geometrySelection(String tempShape) {
        if(tempShape == "pencil") {
            shape = "pencil";
            canvas = new Canvas();
            gc = canvas.getGraphicsContext2D();
            //gc.setFill(Color.LIGHTGRAY);
            gc.setStroke(Color.BLACK);
            gc.setLineWidth(5);
            canvas.setLayoutX(startingPointX);
            canvas.setLayoutY(startingPointY);
            canvas.setWidth(croppedArea.getWidth());
            canvas.setHeight(croppedArea.getHeight());
            System.out.println("canvasAdded");
            group.getChildren().add(canvas);
        }
    }

    public void onMouseReleased(MouseEvent event) {
        if(dragStatus == 1) {
             if(shape == "croppedArea") {
                if (croppedArea.getHeight() > 0 && croppedArea.getWidth() > 0) {
                    pencilBtn.setLayoutX(Math.max(startingPointX, currentEndingPointX) + 5);
                    pencilBtn.setLayoutY(Math.max(startingPointY, currentEndingPointY) - 120);
                    rootPane.getChildren().add(pencilBtn);
                    dragStatus = 0;
                }
            }
            bufferedImage = robot.createScreenCapture(new java.awt.Rectangle((int) startingPointX, (int) startingPointY,
                    (int) croppedArea.getWidth(), (int) croppedArea.getHeight()));
        }


    }

    void adjustRectangleProperties(Double startingPointX, Double startingPointY, Double currentEndingPointX,
            Double currentEndingPointY, Rectangle givenRectangle) {
        givenRectangle.setX(startingPointX);
        givenRectangle.setY(startingPointY);
        givenRectangle.setWidth(currentEndingPointX - startingPointX);
        givenRectangle.setHeight(currentEndingPointY - startingPointY);
        if (givenRectangle.getWidth() < 0) {
            givenRectangle.setWidth(-givenRectangle.getWidth());
            givenRectangle.setX(givenRectangle.getX() - givenRectangle.getWidth());
        }
        if (givenRectangle.getHeight() < 0) {
            givenRectangle.setHeight(-givenRectangle.getHeight());
            givenRectangle.setY(givenRectangle.getY() - givenRectangle.getHeight());
        }
    }

    public Button createButton(String imageName) throws FileNotFoundException {
        FileInputStream iconFile = new FileInputStream(imageName);
        Image iconImage = new Image(iconFile);
        Button button = new Button();
        button.setGraphic(new ImageView(iconImage));
        button.setMaxSize(20, 20);
        button.setPadding(Insets.EMPTY);
        return button;
    }


    public static void main(String[] args) {
        launch(args);
    }
}

`

...