代码之家  ›  专栏  ›  技术社区  ›  deHaar

如何在要绑定到的矩形中创建centerXProperty?

  •  0
  • deHaar  · 技术社区  · 9 年前

    我正在开发一个视频注释程序。视频中看到的对象可以标记为感兴趣的对象,如果它们正在交互,用户可以在两个注释之间划一条线。在可见级别上,对象注释基本上是透明的 Rectangle Line 到相应的中心 长方形 . 我尝试了以下方法:

    创建两个 DoubleBinding s在计算中心x和y的矩形类中:

    private DoubleBinding centerXBinding = new DoubleBinding() { 
        @Override
        protected double computeValue() {
            return getX() + getWidth() / 2;
        }
    };
    

    然后将其绑定到新创建的 线

    `currentRelation.startXProperty().bind(startShape.centerXBinding());`
    

    在控制器中

    被拖动到另一个位置,线条末端不会移动! 有人看到这个问题吗?

    更新:

    a的运动 长方形 通过计算偏移量并更新平移值来完成,如 translateX :

    public class MyRectangle extends Rectangle {
    
        private double orgSceneX;
        private double orgSceneY;
        private double orgTranslateX;
        private double orgTranslateY;
    
        private void initEventHandling() {
            this.setOnMousePressed(mousePress -> {
                if (mousePress.getButton() == MouseButton.PRIMARY) {
                    orgSceneX = mousePress.getSceneX();
                    orgSceneY = mousePress.getSceneY();
                    orgTranslateX = ((MyRectangle) mousePress.getSource()).getTranslateX();
                    orgTranslateY = ((MyRectangle) mousePress.getSource()).getTranslateY();
                    mousePress.consume();
                } else if (mousePress.getButton() == MouseButton.SECONDARY) {
                        System.out.println(LOG_TAG + ": right mouse button PRESS on " + this.getId() + ", event not consumed");
                }
            });
    
            this.setOnMouseDragged(mouseDrag -> {
                if (mouseDrag.getButton() == MouseButton.PRIMARY) {
    
                    double offsetX = mouseDrag.getSceneX() - orgSceneX;
                    double offsetY = mouseDrag.getSceneY() - orgSceneY;
                    double updateTranslateX = orgTranslateX + offsetX;
                    double updateTranslateY = orgTranslateY + offsetY;
                    this.setTranslateX(updateTranslateX);
                    this.setTranslateY(updateTranslateY);
                    mouseDrag.consume();
                }
            });
        }
    }
    
    1 回复  |  直到 9 年前
        1
  •  2
  •   James_D    9 年前

    当任何一个 xProperty 或 widthProperty 是无效的(因此绑定到它的任何东西都知道要重新计算)。您可以通过拨打 bind method

    private DoubleBinding centerXBinding = new DoubleBinding() { 
    
        {
            bind(xProperty(), widthProperty());
        }
    
        @Override
        protected double computeValue() {
            return getX() + getWidth() / 2;
        }
    };
    

    注意,您也可以这样做

    private DoubleBinding centerXBinding = xProperty().add(widthProperty().divide(2));
    

    绑定到 x 和 width 显然,属性假设您正在通过更改其中一个或两个属性来移动矩形。如果您通过其他方式移动矩形(例如,通过更改其 translateX translateY boundsInParentProperty 相反:

    private DoubleBinding centerXBinding = new DoubleBinding() {
    
        {
            bind(boundsInParentProperty());
        }
    
        @Override
        protected double computeValue() {
            Bounds bounds = getBoundsInParent();
            return (bounds.getMinX() + bounds.getMaxX()) / 2 ;
        }
    }
    

    此绑定将提供父坐标系(通常是您想要的坐标系)中矩形中心的x坐标。

    推荐文章