Java 通过鼠标单击添加/删除
我写了一个程序,用户可以在一个矩形中添加和删除圆圈,当用户左键单击时添加,当他/她右键单击时删除,虽然添加正确,但删除效果不好,例如:当我添加四个圆圈并尝试删除所有圆圈时,有些没有移除,我不知道为什么,我很困惑。请帮忙Java 通过鼠标单击添加/删除,java,javafx,javafx-8,Java,Javafx,Javafx 8,我写了一个程序,用户可以在一个矩形中添加和删除圆圈,当用户左键单击时添加,当他/她右键单击时删除,虽然添加正确,但删除效果不好,例如:当我添加四个圆圈并尝试删除所有圆圈时,有些没有移除,我不知道为什么,我很困惑。请帮忙 public class BoundingRectangle extends Application { @Override public void start(Stage primaryStage) { Pane pane = new Pane(); Array
public class BoundingRectangle extends Application {
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
ArrayList<Circle> list = new ArrayList<>();
Rectangle rectangle1 = new Rectangle(10, 10, 175, 80);
rectangle1.setStroke(Color.BLACK);
rectangle1.setFill(Color.WHITE);
Rectangle rectangle2 = new Rectangle(250, 75, 300, 200);
rectangle2.setStroke(Color.BLACK);
rectangle2.setFill(Color.WHITE);
Text text = new Text(20, 33, "INSTRUCTION\n" +
"Add: Left Click\nRemove: Right Click");
pane.setOnMouseClicked(e -> {
if (e.getButton() == MouseButton.PRIMARY) {
Circle circle = new Circle(e.getX(), e.getY(), 10);
list.add(circle);
circle.setStroke(Color.BLACK);
circle.setFill(Color.WHITE);
if (circle.getCenterX() - rectangle2.getX() < 10) {
circle.setCenterX(rectangle2.getX() + 10);
}
else if (circle.getCenterY() - rectangle2.getY() < 10) {
circle.setCenterY(rectangle2.getY() + 10);
}
else if (rectangle2.getX() + rectangle2.getWidth() -
circle.getCenterX() < 10) {
circle.setCenterX(rectangle2.getX() + rectangle2.getWidth() - 10);
}
else if (rectangle2.getY() + rectangle2.getHeight() -
circle.getCenterY() < 10) {
circle.setCenterY(rectangle2.getY() + rectangle2.getHeight() - 10);
}
pane.getChildren().add(circle);
}
else if (e.getButton() == MouseButton.SECONDARY) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).contains(e.getX(), e.getY())) {
pane.getChildren().remove(list.get(i));
list.remove(i);
break;
}
}
}
});
pane.getChildren().addAll(rectangle1, rectangle2, text);
Scene scene = new Scene(pane, 600, 300);
primaryStage.setScene(scene);
primaryStage.setTitle("BoundingRectangle");
primaryStage.show();
}
}
public类BoundingRectangle扩展应用程序{
@凌驾
公共无效开始(阶段primaryStage){
窗格=新窗格();
ArrayList=新建ArrayList();
矩形矩形1=新矩形(10,10,175,80);
矩形1.调整行程(颜色:黑色);
矩形1.设置填充(颜色:白色);
矩形矩形2=新矩形(250、75、300、200);
矩形2.调整行程(颜色:黑色);
矩形2.设置填充(颜色:白色);
Text Text=新文本(20,33,“说明\n”+
“添加:左键单击\n删除:右键单击”);
窗格。设置鼠标单击(e->{
如果(例如getButton()==MouseButton.PRIMARY){
圆=新的圆(e.getX(),e.getY(),10);
列表。添加(圆圈);
圆整定行程(颜色为黑色);
圆形。设置填充(颜色。白色);
if(circle.getCenterX()-rectangle2.getX()<10){
circle.setCenterX(矩形2.getX()+10);
}
else if(circle.getCenterY()-rectangle2.getY()<10){
圆.setCenterY(矩形2.getY()+10);
}
else if(rectangle2.getX()+rectangle2.getWidth())-
circle.getCenterX()<10){
circle.setCenterX(rectangle2.getX()+rectangle2.getWidth()-10);
}
else if(rectangle2.getY()+rectangle2.getHeight())-
circle.getCenterY()<10){
circle.setCenterY(矩形2.getY()+矩形2.getHeight()-10);
}
pane.getChildren().add(圆圈);
}
else if(e.getButton()==MouseButton.SECONDARY){
对于(int i=0;i
我认为这看起来像一个bug:如果在右键单击失败后重新调整窗口大小,则“调整大小”命令强制重新绘制会删除圆圈。一些简单的调试表明,圆圈在应该的时候会从窗格的子列表中删除(因此这是一个重新绘制问题)
作为解决方法,请使用窗格替换第二个矩形。下面是直接替换的代码,没有其他更改:您实际上可以对其进行重构以简化它(例如,将鼠标侦听器注册到第二个窗格而不是第一个窗格以进行添加,将鼠标侦听器注册到每个圆圈以进行删除):
我认为这看起来像一个bug:如果在右键单击失败后重新调整窗口大小,则“调整大小”命令强制重新绘制将删除该圆。一些简单的调试表明,圆圈在应该的时候会从窗格的子列表中删除(因此这是一个重新绘制问题) 作为解决方法,请使用窗格替换第二个矩形。下面是直接替换的代码,没有其他更改:您实际上可以对其进行重构以简化它(例如,将鼠标侦听器注册到第二个窗格而不是第一个窗格以进行添加,将鼠标侦听器注册到每个圆圈以进行删除):
我认为这看起来像一个bug:如果在右键单击失败后重新调整窗口大小,则“调整大小”命令强制重新绘制将删除该圆。一些简单的调试表明,圆圈在应该的时候会从窗格的子列表中删除(因此这是一个重新绘制问题) 作为解决方法,请使用窗格替换第二个矩形。下面是直接替换的代码,没有其他更改:您实际上可以对其进行重构以简化它(例如,将鼠标侦听器注册到第二个窗格而不是第一个窗格以进行添加,将鼠标侦听器注册到每个圆圈以进行删除):
我认为这看起来像一个bug:如果在右键单击失败后重新调整窗口大小,则“调整大小”命令强制重新绘制将删除该圆。一些简单的调试表明,圆圈在应该的时候会从窗格的子列表中删除(因此这是一个重新绘制问题) 作为解决方法,请使用窗格替换第二个矩形。下面是直接替换的代码,没有其他更改:您实际上可以对其进行重构以简化它(例如,将鼠标侦听器注册到第二个窗格而不是第一个窗格以进行添加,将鼠标侦听器注册到每个圆圈以进行删除):
看起来像是一个bug:它们正在正确地从窗格中删除,但窗格没有重新绘制。如果在其中一次右键单击失败后重新调整窗口大小,则重新绘制将强制删除圆。看起来像是一个错误:它们已正确地从窗格中删除,但窗格未重新绘制。如果在其中一次右键单击失败后重新调整窗口大小,则重新绘制将强制删除圆。看起来像是一个错误:它们已正确地从窗格中删除,但窗格未重新绘制。如果在其中一次右键单击失败后重新调整窗口大小,则重新绘制将强制删除圆。看起来像是一个错误:它们已正确地从窗格中删除,但窗格未重新绘制。如果在右键单击失败后调整窗口大小,则重新绘制将强制删除圆。
import java.util.ArrayList;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class BoundingRectangle extends Application {
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
ArrayList<Circle> list = new ArrayList<>();
Rectangle rectangle1 = new Rectangle(10, 10, 175, 80);
rectangle1.setStroke(Color.BLACK);
rectangle1.setFill(Color.WHITE);
Pane rectangle2 = new Pane();
rectangle2.relocate(250, 75);
rectangle2.setPrefSize(300, 200);
rectangle2.setStyle("-fx-border-color: black;");
Text text = new Text(20, 33, "INSTRUCTION\n"
+ "Add: Left Click\nRemove: Right Click");
pane.setOnMouseClicked(e -> {
if (e.getButton() == MouseButton.PRIMARY) {
Circle circle = new Circle(e.getX(), e.getY(), 10);
list.add(circle);
circle.setStroke(Color.BLACK);
circle.setFill(Color.WHITE);
if (circle.getCenterX() - rectangle2.getBoundsInParent().getMinX() < 10) {
circle.setCenterX(rectangle2.getBoundsInParent().getMinX() + 10);
} else if (circle.getCenterY() - rectangle2.getBoundsInParent().getMinY() < 10) {
circle.setCenterY(rectangle2.getBoundsInParent().getMinY() + 10);
} else if (rectangle2.getBoundsInParent().getMaxX()
- circle.getCenterX() < 10) {
circle.setCenterX(rectangle2.getBoundsInParent().getMaxX() - 10);
} else if (rectangle2.getBoundsInParent().getMaxY()
- circle.getCenterY() < 10) {
circle.setCenterY(rectangle2.getBoundsInParent().getMaxY() - 10);
}
pane.getChildren().add(circle);
}
else if (e.getButton() == MouseButton.SECONDARY) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i).contains(e.getX(), e.getY())) {
pane.getChildren().remove(list.get(i));
list.remove(i);
break;
}
}
}
});
pane.getChildren().addAll(rectangle1, rectangle2, text);
Scene scene = new Scene(pane, 600, 300);
primaryStage.setScene(scene);
primaryStage.setTitle("BoundingRectangle");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Text;
import javafx.stage.Stage;
public class BoundingRectangle extends Application {
@Override
public void start(Stage primaryStage) {
Pane pane = new Pane();
Rectangle rectangle1 = new Rectangle(10, 10, 175, 80);
rectangle1.setStroke(Color.BLACK);
rectangle1.setFill(Color.WHITE);
Pane rectangle2 = new Pane();
rectangle2.relocate(250, 75);
rectangle2.setPrefSize(300, 200);
rectangle2.setStyle("-fx-border-color: black;");
Text text = new Text(20, 33, "INSTRUCTION\n"
+ "Add: Left Click\nRemove: Right Click");
rectangle2.setOnMouseClicked(e -> {
if (e.getButton() == MouseButton.PRIMARY) {
Circle circle = new Circle(e.getX(), e.getY(), 10);
circle.setOnMouseClicked(evt -> {
if (evt.getButton() == MouseButton.SECONDARY) {
rectangle2.getChildren().remove(circle);
}
});
circle.setStroke(Color.BLACK);
circle.setFill(Color.WHITE);
rectangle2.getChildren().add(circle);
}
});
pane.getChildren().addAll(rectangle1, rectangle2, text);
Scene scene = new Scene(pane, 600, 300);
primaryStage.setScene(scene);
primaryStage.setTitle("BoundingRectangle");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}