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 回答