繁体   English   中英

JavaFX在创建边界矩形时删除了一个以上的圆

[英]JavaFX removing more than one circle while creating bounding rectangle

我正在制作一个javafx应用程序,它在用户单击主鼠标时在用户创建的圆周围创建一个有界矩形。 用户还可以使用辅助鼠标按钮删除一个圆,并且边界矩形应做出相应的反应,并将剩余的圆用作其上限和下限。 我的程序的问题是,当我尝试连续删除一个以上的圆圈时,它不起作用(它只会删除最后一个圆圈并调整其大小)

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.Collections;

public class BoundRectangle extends Application {
    double minX, maxX, minY, maxY;
    Pane pane = new Pane();
    Rectangle rectangle;
    ArrayList<Circle> allCircles = new ArrayList<>();

    @Override
    public void start(Stage primaryStage) {

        VBox mainBox = new VBox();
        Pane mainPane = new Pane(mainBox);
        mainPane.setPadding(new Insets(10, 10, 10, 10));

        pane.getChildren().addAll(mainPane);
        mainBox.setLayoutX(10);
        mainBox.setLayoutY(10);

        pane.setOnMouseClicked(e -> {
             if (e.getButton() == MouseButton.PRIMARY)   {
                   Circle circle = new Circle(e.getX(), e.getY(), 10);
                   allCircles.add(circle);

                   pane.getChildren().add(drawRectangle());
                   pane.getChildren().add(circle);
                   System.out.println("maxX " + maxX);
                   System.out.println("maxY " + maxY);
                   System.out.println("minX " + minX);
                   System.out.println("minY " + minY);

                circle.setOnMouseClicked(evt -> {
                    if (evt.getButton() == MouseButton.SECONDARY) {
                            pane.getChildren().remove(circle);
                            allCircles.remove(circle);
                        pane.getChildren().add(drawRectangle());

                    }

                });

                circle.setStroke(Color.BURLYWOOD);
                circle.setStrokeWidth(3);
                circle.setFill(Color.TRANSPARENT);

            }
        });

        Scene scene = new Scene(pane, 600, 600);

        primaryStage.setScene(scene);
        primaryStage.setTitle("click circles, make rectangle");
        primaryStage.show();
    }

    public Rectangle drawRectangle() {
        refresh();
        getMinMax();

        if (pane.getChildren().size() == 1)
        {
            Rectangle rect0 = new Rectangle(0, 0, 0, 0);
            return rect0;
         }

        Rectangle boundingRect = new Rectangle();
        boundingRect.setX(minX - 10 - 2);
        boundingRect.setY(minY - 10 - 2);
        boundingRect.setWidth(maxX - minX + 2.0 * 10 + 2);
        boundingRect.setHeight(maxY - minY + 2.0 * 10 + 2);
        boundingRect.setStroke(Color.BLACK);
        boundingRect.setStrokeWidth(2);
        boundingRect.setFill(Color.TRANSPARENT);

        return boundingRect;
    }

    public void getMinMax() {

        maxY = allCircles.get(0).getCenterY();
        minY = allCircles.get(0).getCenterY();
        maxX = allCircles.get(0).getCenterX();
        minX = allCircles.get(0).getCenterX();

        for (Circle c : allCircles) {
            if (c.getCenterX() < minX)
                minX = c.getCenterX();
            if (c.getCenterX() > maxX)
                maxX = c.getCenterX();
            if (c.getCenterY() < minY)
                minY = c.getCenterY();
            if (c.getCenterY() > maxY)
                maxY = c.getCenterY();
         }
    }

    private void refresh() {
        ObservableList<Node> list = pane.getChildren();

        for (Node c : list) {
            if (c instanceof Rectangle) {
                pane.getChildren().remove(c);
                break;
            }
        }
    }

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

您添加的最后一个圆出现在矩形的顶部; 但是,矩形会出现在所有其他圆圈的顶部。 因此,只有最后添加的圆会获得鼠标点击(其他圆上的点击以该矩形为目标)。

最快的解决方法是使矩形鼠标透明:

boundingRect.setMouseTransparent(true);

总体而言,更好的解决方案是仅创建一个矩形并更新其xywidthheight属性。 这样,您只需确保将矩形添加一次并保留在堆栈的底部即可。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM