在鼠标点击事件处理程序中重用 getX() getY()



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

以下是摘要:我正在尝试捕获连续点击作为端点。 我将在这些点之间绘制 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);

我看到第一点和第二点具有相同的 x,y 值。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新