У меня есть 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();
}
}
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();
@febot Только Circle имеют свойство centerX (это не имеет смысла для других узлов). Каждый Node имеет «свойства преобразования», такие как translateX, scaleX, rotate и т. д. Поскольку TranslateTransition может работать с любым Node, он должен использовать свойства, общие для всех Node. См. openjfx.io/javadoc/14/javafx.graphics/javafx/scene/Node.html
Спасибо. Это сработало, как и ожидалось. Хотя мне интересно, почему существует отдельное свойство translateX.