0

次のような形状のグループがあります。

Group g = new Group();
Rectangle r = new Rectangle( 100, 100, 50, 50 );
Circle c = new Circle( 125, 125, 10 );
g.getChildren().addAll( r, c );

グループの一部ではなく、円の中心で終了する線。

Line l = new Line( 0, 0, 125, 125 );

Ensemble のマウス イベントのデモ (x と y の変換プロパティを更新するマウス リスナーの数だけ) に従って、グループをドラッグできるようにしました。私が望むのは、線の終わりが円の中心に従うことです。これは、行の endX および endY プロパティを更新することを意味します。

私が抱えている問題は、endX と endY がシーンのローカル空間にあることです (と思います)。グループを画面上でドラッグすると、円の centerX および centerY プロパティが更新されません。私が得ているように見えるのは、グループのtranslationXとtranslationYへの変更だけです。ドラッグ操作の後 (および操作中) に円の新しい中心を見つける方法がわかりません。

これは私の髪を引き裂くようになったので、ポインターは非常に感謝して受け取りました!

私が思いついた最善の解決策は、グループに翻訳リスナーを配置し、円の中心位置を取得してから、グループの翻訳を追加することですが、結果は正確ではありません。円を描きますが、飛び跳ねて漂流します。このようなもの:

translateXProperty().addListener( new ChangeListener<Number>() {
    public void changed(ObservableValue<? extends Number> ov, Number oldValue, Number newValue) {
        Connector c = getInputConnectors().get( 0 );
        double x = circle.getCenterX();
        double y = circle.getCenterY();
        line.setEndX( x + newValue.doubleValue());
    }
});
4

1 に答える 1

1

バインディングを使用:

    l.endXProperty().bind(g.translateXProperty().add(c.centerXProperty()));
    l.endYProperty().bind(g.translateYProperty().add(c.centerYProperty()));

PS: あなたの方法でも機能しますが、 x プロパティと y プロパティの両方のリスナーが必要であることに注意してください。

于 2012-05-05T14:49:33.403 に答える