这是一个很长的问题。我试图使其更加简洁,但我认为您需要所有信息来帮助您。

总结如下:
我正在尝试捕获连续的点击作为端点。我将在这些点之间绘制line2D对象。我有一个侦听器,它将单击事件中的x和y值发送到帮助程序类。我的得分永远不会超过两点,因此帮助器类仅具有firstPoint和secondPoint成员。我得到点击,并使用evt.getX()和evt.getY()将坐标发送到帮助器类。助手创建点,但是firstPoint的坐标与secondPoint相同。我对正在发生的事情的详细信息可以在代码块下面找到。

这是我的鼠标单击处理程序中的代码:

public class Dashboard extends javax.swing.JFrame {

    public static ClickMaster myClicks = new ClickMaster();
    public static boolean drawing = false;
    private MyPoint firstPoint = new MyPoint();
    private MyPoint secondPoint = new MyPoint();






private void MyDrawingPanelMouseClicked(java.awt.event.MouseEvent evt) {
        if (firstPoint.getPointType().equals(MyPoint.PointType.NULL)) {
            drawing = !drawing;
            firstPoint = myClicks.parseClick(evt.getX(), evt.getY(), drawing);
        } else if (drawing){
            drawing = !drawing;
            secondPoint = myClicks.parseClick(evt.getX(), evt.getY(), drawing);
            myClicks.parsePoints(firstPoint, secondPoint);
        }
}


这是返回点的帮助器类:

public class ClickMaster {

    MyPoint anyPoint = new MyPoint();

    public ClickMaster() {
        anyPoint.setPointType(MyPoint.PointType.NULL);
    }

    public MyPoint parseClick(double x, double y, boolean firstClick) {
            if (firstClick) {
                anyPoint.setPointType(MyPoint.PointType.ANCHOR);
            } else {
                anyPoint.setPointType(MyPoint.PointType.END);
            }

        anyPoint.setX(x);
        anyPoint.setY(y);

        return anyPoint;
    }


如果相关的话,这是我对Point2D对象的实现:

public class MyPoint extends Point2D {

    public enum PointType {

        ANCHOR, END, SOLO, NULL
    };

    double x;
    double y;
    PointType pointType;

    public MyPoint(PointType pType, double x, double y) {

        this.x = x;
        this.y = y;
        this.pointType = pType;
    }

    public MyPoint() {
        this.x = 0.0;
        this.y = 0.0;
        this.pointType = PointType.NULL;
    }


+如您所愿的标准吸气剂/设置器。

调试表明

firstPoint = myClicks.parseClick(firstX, firstY, drawing);


会导致鼠标事件的x和y值指向一个点。这是预期的。

同样

secondPoint = myClicks.parseClick(evt.getX(), evt.getY(), drawing);


产生具有第二次单击的x和y值的点。也预期。

但是,当我打电话

myClicks.parsePoints(firstPoint, secondPoint);


我看到firstPoint和secondPoint具有相同的x,y值。

我不确定,但我相信是因为firstPoint和secondPoint都从鼠标evt获取了它们的x和y值。我想我需要将针对x和y的double类型的值放入firstPoint和secondPoint中,而不是对getX()和getY()从鼠标事件返回的double值的引用。

我只是不知道如何实现它。

此外,如果有更好的方法来捕获连续的点击并将其转换为形状的端点,我也欢迎您提供反馈。

最佳答案

实际上,您的问题是anyPoint。由于您只有一个ClickMaster实例,而且anyPoint仅初始化一次,因此无论调用parseClick多少次,都将返回对同一对象的引用。每次调用ParseClick时,都需要创建一个新的MyPoint并将其返回。

09-26 13:45