Почему привязки не работают с переходами

У меня есть Circle, и его свойство centerX связано со свойством text метки. Это для просмотра положения объекта на экране. Привязка, кажется, перестает работать всякий раз, когда я применяю переход к кругу. Это фрагмент кода.

//ERRONEOUS PART OF CODE
        Circle circle = new Circle(50, 20, 20);
        Label posLabel = new Label();
        //binding
        StringBinding binding = new StringBinding(){
            {bind(circle.centerXProperty());}
            @Override public String computeValue(){
                return Double.toString(circle.getCenterX());
            }
        };
        posLabel.textProperty().bind(binding);
        //translation
        TranslateTransition transition = new TranslateTransition(Duration.seconds(3), circle);
        transition.setByX(250);
        transition.play();

Я хотел бы знать, почему привязки не работают с переходами, и, если возможно, обходной путь к этой проблеме.

P.S. Полный минимальный воспроизводимый пример: (я говорю, что привязка не работает, потому что значение меток застряло на 50,0)

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.Group;
import javafx.scene.control.Label;
import javafx.scene.shape.Circle;
import javafx.animation.TranslateTransition;
import javafx.util.Duration;
import javafx.beans.binding.StringBinding;
public class TransitionError extends Application
{
    public void start(Stage stage) throws Exception
    {
        //instantiating all objects
        Circle circle = new Circle(50, 20, 20);
        Label posLabel = new Label();
        Group group = new Group(circle, posLabel);
        Scene scene = new Scene(group, 300,100);
        stage.setTitle("JavaFX Example");
        stage.setFullScreen(true);
        stage.setScene(scene);
        stage.show();
        
        //ERRONEOUS PART OF CODE
        //binding
        StringBinding binding = new StringBinding(){
            {bind(circle.centerXProperty());}
            @Override public String computeValue(){
                return Double.toString(circle.getCenterX());
            }
        };
        posLabel.textProperty().bind(binding);
        //translation
        TranslateTransition transition = new TranslateTransition(Duration.seconds(3), circle);
        transition.setByX(250);
        transition.play();
    }
}
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TranslateTransition не меняет значение centerX; это изменяет значение translateX.

Итак, вы можете сделать:

    StringBinding binding = new StringBinding(){
        {bind(circle.centerXProperty(), circle.translateXProperty());}
        @Override public String computeValue(){
            return Double.toString(circle.getCenterX()+circle.getTranslateX());
        }
    };

Или вы можете использовать исходную привязку и вместо этого анимировать свойство centerX (это может быть предпочтительнее, поскольку вы, похоже, полагаетесь на centerX для изменения):

// TranslateTransition transition = new TranslateTransition(Duration.seconds(3), circle);
// transition.setByX(250);
// transition.play();

Timeline timeline = new Timeline(new KeyFrame(
    Duration.seconds(3), 
    new KeyValue(circle.centerXProperty(), circle.getCenterX()+250)
));
timeline.play();

Спасибо. Это сработало, как и ожидалось. Хотя мне интересно, почему существует отдельное свойство translateX.

febot 18.12.2020 18:19

@febot Только Circle имеют свойство centerX (это не имеет смысла для других узлов). Каждый Node имеет «свойства преобразования», такие как translateX, scaleX, rotate и т. д. Поскольку TranslateTransition может работать с любым Node, он должен использовать свойства, общие для всех Node. См. openjfx.io/javadoc/14/javafx.graphics/javafx/scene/Node.html

James_D 18.12.2020 18:20

Другие вопросы по теме