使用 JavaFX 和 setOnMouseMoved 方法在同一场景上创建多个圆圈

问题描述 投票:0回答:1

几天前我开始使用 JavaFX 进行编码,这个练习在过去五个小时左右的时间里一直困扰着我。 我想通过首先单击我想要的中心位置然后移动光标以获得半径来向场景添加圆圈;我也强迫自己暂时不要使用Canvas。

下面的代码与此处提供的代码略有修改:

用鼠标点击点画圆(JavaFX)

为了将每个绘制的圆圈留在屏幕上。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class TestJavaFX extends Application {

    private double cX, cY;
    public boolean firstClick = true;

    @Override

    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 960, 540);

        scene.setOnMouseClicked(evt -> {

            if (firstClick) {
                cX = evt.getX();
                cY = evt.getY();
                firstClick = false;
            } else {
                double r = Math.sqrt(Math.pow(cX - evt.getX(), 2) + Math.pow(cY - evt.getY(), 2));
                Circle circle = new Circle(cX, cY, r, Color.BLUE);
                root.getChildren().add(circle);
                firstClick = true;
            }
        });

        primaryStage.setTitle("TestJavaFX");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

我已经想出了上面的代码,通过单击两次将圆圈添加到场景中,但我无法使用

setOnMouseMoved
复制相同的结果。将
Circle circle = new Circle()
放入
setOnMouseMoved
事件中会在光标每次移动时创建一个新圆圈,从而有效地导致无法与屏幕交互。

java javafx
1个回答
0
投票

要解决此问题并获得您想要的行为(单击以设置圆心,然后拖动鼠标以设置半径),您可以对代码进行一些调整。 setOnMouseMoved 面临的主要问题是,每次鼠标移动时都会创建新的圆,这会导致屏幕因圆而过载。

您需要做的是在单击鼠标时创建圆,然后随着鼠标移动动态更新它的半径。您只需要创建一个圆并在鼠标移动时调整其半径,而不是每次都创建一个新圆。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;

public class TestJavaFX extends Application {

    private double cX, cY;
    private Circle circle; // Keep a reference to the circle
    public boolean firstClick = true;

    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 960, 540);

        scene.setOnMouseClicked(evt -> {
            if (firstClick) {
                cX = evt.getX();
                cY = evt.getY();
                // Create the circle only on the first click
                circle = new Circle(cX, cY, 0, Color.BLUE);
                root.getChildren().add(circle);
                firstClick = false;
            } else {
                // Reset the firstClick flag if the second click is used to confirm the circle
                firstClick = true;
            }
        });

        // Update the circle radius dynamically as the mouse moves
        scene.setOnMouseMoved(evt -> {
            if (!firstClick && circle != null) {
                double r = Math.sqrt(Math.pow(cX - evt.getX(), 2) + Math.pow(cY - evt.getY(), 2));
                circle.setRadius(r);
            }
        });

        primaryStage.setTitle("TestJavaFX");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.