javafx - JavaFX:使用鼠标选择、移动、旋转、绘制和删除矩形
问题描述
我对 JavaFX 还很陌生,只是想实现一些简单的功能。在这种情况下,我想通过鼠标点击在屏幕上绘制矩形。这就是它应该设置的方式:
- 屏幕左上角有一个固定(黑色)矩形
- 通过单击此矩形,应该会暂时出现第二个(蓝色)矩形。然后这个应该跟随鼠标(通过 MouseMoveEvent,没有拖动!应该通过单击黑色矩形来激活移动),黑色矩形保持在原处。
- 当临时蓝色矩形跟随鼠标时,应该有两个选项: 1. 通过右键单击,它应该旋转 90°。通过左键单击,它应该准确地绘制在我单击的位置。
- 只有当我再次左键单击左上角的稳定黑色矩形时,临时蓝色矩形才会消失。
到目前为止的工作:
- 左击后矩形跟随鼠标(虽然这是两个矩形的错误,见下文)
- 通过左键绘制新的蓝色矩形
- 右键旋转
什么不起作用:
- 每次右键单击都会创建一个新的黑色矩形(不知道为什么??我的代码中没有这样的代码)
- 第一次单击黑色矩形已经创建了一个蓝色矩形
这是我的代码:
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);
}
}
解决方案
推荐阅读
- coq - 在 Coq 中将 `not A` 转换为 `A -> False`
- collections - Java 8 Map 合并 VS 计算,本质区别?
- python - 如何在 pyspark 中并行下载大量 URL?
- regex - 在 bash 中提取 CGI 查询参数值
- jmeter - 本地系统(一个主 - 零从)和主从系统 - jmeter中的脚本执行有什么区别?有何不同
- java - 在 Java 中使用椭圆曲线的 El Gamal
- java - 来自扩展 TimerTask 的类中的 IntentService
- python - 如何在 BeautifulSoup 中添加“href contains”条件
- sql - 在 bigquery 中编写最小值的优雅而有效的方法
- r - 使用汽车包中的功能时出错