2017-08-16 7 views
0

私はビデオアノテーション用のプログラムを開発しています。ビデオ中に見られるオブジェクトは関心のあるオブジェクトとしてマークされ、相互作用している場合、ユーザは2つのアノテーションの間に線を引くことができる。可視レベルでは、アノテーションは基本的に透明ですRectangle sであり、それらの間の関係はLineです。この時点では、四角形の中心を計算するのは簡単ですが、Lineの開始と終了を対応するRectangleの中心にバインドすることはできません。バインドするRectangleにcenterXPropertyを作成するにはどうすればよいですか?

は、中心xとyを計算Rectangleクラス内の2つのDoubleBindingの作成:私は、以下のアプローチしようとしている

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

をして、新しく作成されたLineにそれをバインド:

`currentRelation.startXProperty().bind(startShape.centerXBinding());` 
コントローラ内の

...

結果は最初はOKです。行の開始点と終了点は、正確には避けたいところですしかし、Rectangleが別の位置にドラッグされると、行末はどこにも移動しません! 誰にも問題が表示されますか?

UPDATE:Rectangleの動きは、オフセット計算とtranslateXのような翻訳値を更新することによって行われ

:どちらかxPropertyまたはwidthPropertyあるときに無効にするため

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

答えて

2

あなたのバインディングのニーズを無効にされているので(それに束縛されたものは再計算することを知っている)カスタムバインディングのコンストラクタで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)); 

を行うことができる2つの間の選択は本当にあなたが好むどのスタイルだけの問題であることに注意してください。

プロパティは、これらのプロパティのいずれかまたは両方を変更して矩形を移動していることを明示的に前提としています。あなたには、いくつかの他の手段(そのtranslateXまたはtranslateYプロパティのいずれかを変更することにより、例えば、または変換のリストを変更することによって)で矩形を移動している場合は、代わりにboundsInParentPropertyを観察する必要があります。

private DoubleBinding centerXBinding = new DoubleBinding() { 

    { 
     bind(boundsInParentProperty()); 
    } 

    @Override 
    protected double computeValue() { 
     Bounds bounds = getBoundsInParent(); 
     return (bounds.getMinX() + bounds.getMaxX())/2 ; 
    } 
} 

この結合意志親の座標系の矩形の中心のx座標を与えます(これは通常、あなたが望む座標系です)。

+0

残念ながら、 'rectangle'を' translateX'で移動していますので、この解決方法(正しいことですが)はバインディングを行うものではありません。私の動きが翻訳によって行われたときに何をすべきか知っていますか? – deHaar

+1

@deHaarこれは、人々が[MCVE]を含まない質問を投稿したときに非常にイライラしている理由です:彼らが記述した問題は、投稿したコードによって引き起こされたものであり、これはここにある)。あなたの質問を更新してください。 (あるいは、明らかに、 'x'を変更して矩形を動かすようにアプローチを変更してください。) –

+0

残念ですが、私は 'Rectangle'の動きを行うコードで質問を更新しました。私の解決策には対応するプロパティがあるので、翻訳された値を持つバインディングにaproachを変更します。なぜなら、それらはアップタ​​イムになるからです。あなたがより良いアプローチを知っているなら、私に知らせてください。 – deHaar

関連する問題