首页 > 解决方案 > JavaFX:使用鼠标选择、移动、旋转、绘制和删除矩形

问题描述

我对 JavaFX 还很陌生,只是想实现一些简单的功能。在这种情况下,我想通过鼠标点击在屏幕上绘制矩形。这就是它应该设置的方式:

到目前为止的工作:

什么不起作用:

这是我的代码:

import javafx.application.Application;
import javafx.geometry.Point2D;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

public class Main extends Application {
    Point2D offset;
    Node selected;
    Point2D translateStart;

    int height = 100;
    int width = 50;
    int centerX = height/2;
    int centerY = width/2;

    boolean isClicked = false;
    boolean isOnMouse = false;

    @Override
    public void start(Stage primaryStage) {
        Pane root = new Pane();
        Scene scene = new Scene(root, 500, 500);
        Rotate rotate = new Rotate();

        Rectangle rect = new Rectangle(10, 10, width, height);
        root.getChildren().addAll(rect);

        rect.setCursor(Cursor.HAND);

        root.setOnMouseClicked(event -> {
            isClicked = true;
                isOnMouse = true;
                Rectangle temporary = new Rectangle(event.getX()-centerY, event.getY()-centerX, width, height);
                root.getChildren().addAll(temporary);
                Node target = (Node) event.getTarget();
                if (target != root) {
                    // event occured on a child
                    selected = temporary;
                    offset = new Point2D(event.getX(), event.getY());
                    translateStart = new Point2D(selected.getTranslateX(), selected.getTranslateY());
                }

                temporary.rotateProperty().bind(rotate.angleProperty());
                if (event.getButton().equals(MouseButton.SECONDARY)) {
                    rotate.setAngle(rotate.getAngle() + 90);
                } else {
                    if(isOnMouse) {
                        Rectangle newlydrawn = new Rectangle(event.getX()-centerY, event.getY()-centerX, width, height);
                        newlydrawn.setRotate(rotate.getAngle());
                        newlydrawn.setFill(Color.BLUE);
                        root.getChildren().addAll(newlydrawn);
                        event.consume();
                    }
                    if(event.getSource() instanceof Rectangle) {
                        isClicked = false;
                        root.getChildren().remove(temporary);
                        event.consume();
                    }
                }
            event.consume();
        });

        root.setOnMouseMoved(event -> {
            if (selected != null) {
                selected.setTranslateX(event.getX() - offset.getX() + translateStart.getX());
                selected.setTranslateY(event.getY() - offset.getY() + translateStart.getY());
            }
            event.consume();
        });

        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

标签: javafxmouseevent

解决方案


推荐阅读