当我在 JavaFX 中拖动鼠标时圆圈不可见

Circle not visible as I drag the mouse in JavaFX

我正在用 JavaFX 创建一个小的绘图程序,并且有一个圆形创建工具。目前,我可以正确地绘制圆,但与我的其他工具不同,我看不到正在创建的圆(即,当我拖动鼠标时)。只有当我松开鼠标时,我才能看到圆圈(以正确的尺寸绘制)。我尝试在拖动时添加 strokeOval() 方法,但它创建了一个奇怪的 "teardrop" 类圆圈。我什么都试过了 - 谁能帮忙?

这是我的代码:

public CircleController(Canvas canvas, Scene mainScene, BorderPane borderPane) {

    this.borderPane = borderPane;
    this.mainScene = mainScene;
    this.graphicsContext = canvas.getGraphicsContext2D();

    circle = new Circle();
    circle.setStrokeWidth(1.0);
    circle.setFill(Color.WHITE);
    circle.setStroke(Color.BLACK);

    mousePressed = event -> {
        startingPosX = event.getX();
        startingPosY = event.getY();
        borderPane.getChildren().add(circle);

    };

    mouseReleased = event -> {
        borderPane.getChildren().remove(circle);
        double width = Math.abs(event.getX() - startingPosX);
        double height = Math.abs(event.getY() - startingPosY);
        graphicsContext.strokeOval(startingPosX, startingPosY, width, height);
        graphicsContext.setStroke(Color.BLACK);
        removeListeners();
    };

    mouseDragged = event -> {
        circle.setCenterX(event.getX() - startingPosX);
        circle.setCenterY(event.getY() - startingPosY);

    };
}

上面的代码正确地创建了圆圈,但是在我松开鼠标之前看不到。我将上述 EventHandlers 应用于我的场景:

@Override
public void handle(ActionEvent event) {
    mainScene.setOnMousePressed(mousePressed);
    mainScene.setOnMouseDragged(mouseDragged);
    mainScene.setOnMouseReleased(mouseReleased);
}

有人可以帮忙吗?

你画的是椭圆而不是圆形Circle class 无法适当地处理这个问题。你需要Ellipse。此外请注意,从手势开始拖动 up/left 会导致椭圆形的奇怪行为,因为它总是绘制在坐标系的第一象限中,原点在拖动手势的开始。

下面的代码应该允许在每个象限中绘制椭圆并且还使用 Ellipse 作为 "preview":

// TODO: replace circle field with ellipse field of type Ellipse
ellipse = new Ellipse();
ellipse.setStrokeWidth(1.0);
ellipse.setFill(Color.TRANSPARENT);
ellipse.setStroke(Color.BLACK);

mousePressed = event -> {
    startingPosX = event.getX();
    startingPosY = event.getY();
    ellipse.setCenterX(startingPosX);
    ellipse.setCenterY(startingPosY);
    ellipse.setRadiusX(0);
    ellipse.setRadiusY(0);
    borderPane.getChildren().add(ellipse);
};

mouseReleased = event -> {
    borderPane.getChildren().remove(ellipse);
    double width = Math.abs(event.getX() - startingPosX);
    double height = Math.abs(event.getY() - startingPosY);
    graphicsContext.setStroke(Color.BLACK);
    graphicsContext.strokeOval(Math.min(startingPosX, event.getX()), Math.min(startingPosY, event.getY()), width, height);
    removeListeners();
};

mouseDragged = event -> {
    ellipse.setCenterX((event.getX() + startingPosX) / 2);
    ellipse.setCenterY((event.getY() + startingPosY) / 2);
    ellipse.setRadiusX(Math.abs((event.getX() - startingPosX) / 2));
    ellipse.setRadiusY(Math.abs((event.getY() - startingPosY) / 2));
};