Привязка метки JavaFx к выходу функции, который изменяется в соответствии со свойством трех узлов - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу связать текстовое свойство Label со значением из функции, которая будет принимать массив узлов (то есть три линейных узла), а затем выполнить некоторые вычисления на основе свойства позиции узлов (то есть startXProperty), так что всякий раз, когда позиции узлов изменяются, текст метки будет обновляться соответствующим образом.

Это моя попытка:

Label label = new Label();

DoubleProperty myFunction(Line[] lines){

      DoubleProperty property= new SimpleDoubleProperty();

      // This is a sample computation, because the actual computation is much more complex. 
      // That's why I tried to avoid using the arithmetic methods provided by the Property class,
      // i.e., property().add().multiply()

      double computation = Math.sqrt(Math.pow(lines[0].startXProperty().getValue() - lines[1].startXProperty().getValue());

      property.setValue(computation);

      return property;
}

label.textProperty().bind(myFunction(lines).asString());

И этот подход не работает.Я ищу способ исправить это.Спасибо!

1 Ответ

0 голосов
/ 26 февраля 2019

ОБНОВЛЕНИЕ: решено

Благодаря ответам, представленным в комментарии, я изменил функцию, чтобы она возвращала DoubleBinding и привязывала к нему label, и тогда она работает!

Label label = new Label();

DoubleBinding myFunction(Line[] lines){

      DoubleProperty line_StartX[] = new DoubleProperty[lines.length];
      DoubleProperty line_EndX[] = new DoubleProperty[lines.length];
      DoubleProperty line_StartY[] = new DoubleProperty[lines.length];
      DoubleProperty line_EndY[] = new DoubleProperty[lines.length];

      for (int i = 0; i < lines.length; i++) {
          line_StartX[i] = lines[i].startXProperty();
          line_EndX[i] = lines[i].endXProperty();
          line_StartY[i] = lines[i].startYProperty();
          line_EndY[i] = lines[i].endYProperty();
      }

      DoubleBinding distBinding = new DoubleBinding() {
        {
            for (int i=0; i<3; i++){
                  super.bind(line_StartX[i]);
                  super.bind(line_EndX[i]);
                  super.bind(line_StartY[i]);
                  super.bind(line_EndY[i]);
            }
        }

        @Override
        protected double computeValue() {
            double a = Math.sqrt(Math.pow(lines_StartX[0].getValue() - lines_StartX[1].getValue(),2));
            return a;
        }
      };

      return distBinding;
}

label.textProperty().bind(myFunction(lines).asString());         

Теперь все работает как надо!Еще один последний вопрос, при использовании super.bind(prop1, prop2, prop3), есть ли более простой способ добавить целую группу элементов в массив сразу?

...