在组中查找Shape的场景位置

时间:2012-05-05 13:08:42

标签: javafx-2

我有一组像这样的形状:

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());
    }
});

1 个答案:

答案 0 :(得分:1)

使用绑定:

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

P.S。:你的方式也可以,但请注意你应该有x和y属性的监听器。