JavaFX在创建边框时删除多个圆

JavaFX在创建边框时删除多个圆,java,javafx,Java,Javafx,我正在制作一个javafx应用程序,它围绕用户在主鼠标单击时创建的圆圈创建一个有界矩形。用户还可以使用鼠标次键删除一个圆,边框应做出相应的反应,并使用剩余的圆作为其上限和下限。我的程序的问题是,当我试图删除一行中的多个圆时,它不起作用(它只删除最后一个圆并调整其大小) 导入javafx.application.application; 导入javafx.collections.ObservableList; 导入javafx.event.event; 导入javafx.geometry.Inse

我正在制作一个javafx应用程序,它围绕用户在主鼠标单击时创建的圆圈创建一个有界矩形。用户还可以使用鼠标次键删除一个圆,边框应做出相应的反应,并使用剩余的圆作为其上限和下限。我的程序的问题是,当我试图删除一行中的多个圆时,它不起作用(它只删除最后一个圆并调整其大小)

导入javafx.application.application;
导入javafx.collections.ObservableList;
导入javafx.event.event;
导入javafx.geometry.Insets;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.input.MouseButton;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.layout.Pane;
导入javafx.scene.layout.VBox;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Circle;
导入javafx.scene.shape.Rectangle;
导入javafx.stage.stage;
导入java.util.ArrayList;
导入java.util.Collections;
公共类BoundRectangle扩展了应用程序{
双minX,maxX,minY,maxY;
窗格=新窗格();
矩形;
ArrayList allCircles=新的ArrayList();
@凌驾
公共无效开始(阶段primaryStage){
VBox mainBox=新的VBox();
窗格主窗格=新窗格(主框);
主窗格。设置填充(新插图(10,10,10,10));
pane.getChildren().addAll(主窗格);
mainBox.setLayoutX(10);
主机箱设置布局(10);
窗格。设置鼠标单击(e->{
如果(例如getButton()==MouseButton.PRIMARY){
圆=新的圆(e.getX(),e.getY(),10);
所有圆。添加(圆);
pane.getChildren().add(drawRectangle());
pane.getChildren().add(圆圈);
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(圆圈);
所有圆。删除(圆);
pane.getChildren().add(drawRectangle());
}
});
圆整定行程(颜色:BURLYWOOD);
圆。设定行程宽度(3);
圆形。设置填充(颜色。透明);
}
});
场景=新场景(窗格,600600);
初级阶段。场景(场景);
setTitle(“单击圆形,生成矩形”);
primaryStage.show();
}
公共矩形drawRectangle(){
刷新();
getMinMax();
如果(pane.getChildren().size()==1)
{
矩形rect0=新矩形(0,0,0,0);
返回rect0;
}
矩形边框rect=新矩形();
边界矩形集(minX-10-2);
边界直列(minY-10-2);
boundingRect.setWidth(最大-最小+2.0*10+2);
boundingRect.setHeight(最大-最小+2.0*10+2);
boundingRect.setStroke(颜色为黑色);
boundingRect.设置行程宽度(2);
boundingRect.setFill(颜色透明);
返回boundingRect;
}
public void getMinMax(){
maxY=allCircles.get(0.getCenterY();
minY=allCircles.get(0.getCenterY();
maxX=allCircles.get(0.getCenterX();
minX=allCircles.get(0.getCenterX();
用于(圆圈c:所有圆圈){
if(c.getCenterX()maxX)
maxX=c.getCenterX();
if(c.getCenterY()maxY)
maxY=c.getCenterY();
}
}
私有无效刷新(){
ObservableList=pane.getChildren();
用于(节点c:列表){
if(矩形的c实例){
pane.getChildren().remove(c);
打破
}
}
}
公共静态void main(字符串[]args){
应用程序启动(args);
}
}

您添加的最后一个圆显示在矩形顶部;但是,矩形显示在所有其他圆的顶部。因此,只有添加的最后一个圆将获得鼠标单击(其他圆上的单击指向矩形)

最快的修复方法是使矩形鼠标透明:

boundingRect.setMouseTransparent(true);
总体而言,更好的解决方案可能只是创建一个矩形,并更新其
x
y
宽度
高度
属性。这样,您就可以确保矩形只添加一次,并保持在堆栈的底部

boundingRect.setMouseTransparent(true);