1

これは長い質問です。もっと簡潔にしようとしましたが、支援するにはすべての情報が必要だと思います。

要約は次のとおりです。連続したクリックをエンドポイントとしてキャプチャしようとしています。これらの点の間に line2D オブジェクトを描画します。クリック イベントからヘルパー クラスに x 値と y 値を送信するリスナーがあります。ポイントが 2 つを超えることはないので、ヘルパー クラスには 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);

2 回目のクリックの x 値と y 値を持つポイントになります。こちらも期待。

しかし、私が電話するとき

myClicks.parsePoints(firstPoint, secondPoint);

firstPoint と secondPoint の x、y 値が同じであることがわかります。

よくわかりませんが、firstPoint と secondPoint の両方がマウス evt から x と y の値を取得しているためだと思います。getX() と getY() によってマウス イベントから返される double 値への参照ではなく、x と y の double 型の値を firstPoint と secondPoint に入れる必要があると思います。

私はそれを実現する方法を知りません。

また、連続したクリックをキャプチャして形状のエンドポイントに変換するより良い方法があれば、フィードバックを歓迎します.

4

1 に答える 1

2

実際、あなたの問題はanyPointです。ClickMasterのインスタンスは1つだけであり、anyPointは1回だけ初期化されるため、parseClickを何度呼び出しても、同じオブジェクトへの参照を返します。ParseClickは、呼び出されるたびに新しいMyPointを作成し、それを返す必要があります。

于 2012-06-19T22:08:35.187 に答える