单击鼠标添加/删除

时间:2015-07-15 12:44:37

标签: java javafx javafx-8

我写了这个程序,它允许用户在矩形中添加和删除圆圈,当用户左键单击并在他/她右键单击时删除它时添加,虽然它的添加工作正常但是它的移除不起作用好的,例如:当我添加四个圆圈并尝试删除所有这些圆圈时,其中一些不会移除,我不知道为什么,我感到很困惑。求助。

 $("[id=ClientName]").click(function (event) {// include event argument

        event.preventDefault();// prevent browser folloing url

        var rowIndex = $(this).closest("tr")[0].rowIndex;
        window.open("LiveVehicleDetail.aspx?rowIndex=" + rowIndex, "Popup", "width=350,height=100");
    });

1 个答案:

答案 0 :(得分:3)

我认为这看起来像一个错误:如果在右键单击失败后调整窗口大小,则调整大小强制重绘会删除圆圈。一些简单的调试显示,圆圈会从窗格的子列表中删除(因此它是一个重绘问题)。

要解决此问题,请使用窗格替换第二个矩形。以下是直接替换的代码,没有其他更改:您可以实际重构这一点以简化它(使用第二个窗格而不是第一个窗格注册鼠标侦听器以进行添加,并使用每个圆圈注册鼠标侦听器以进行删除,例如):

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);
    }
}

这是重构版本。由于rectangle2现在是Pane,您可以直接添加圈子,而不必担心调整其位置。右键单击是在圆圈本身处理的,因此不需要代码来检查点击是否在圆圈上,因此,不需要单独的圆圈列表(尽管您的真实应用程序可能需要其他原因)。

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);
    }
}