Я пытаюсь связать цвет (заливка), который является ObjectProperty<Paint> (fillProperty)
формы круга JavaFX. Для этого я использую низкоуровневую объектную привязку. Я хочу использовать Color.hsb()
, чтобы создать новый цвет, используя значение оттенка, которое будет масштабироваться в соответствии с требуемым значением SpeedProperty, которое хранится в классе Car, и фактической скоростью автомобиля.
Я пробовал несколько способов привязки значения скорости автомобиля, включая DoubleBinding, чтобы сохранить значение скорости. Я также явно пытался getFill()
формы Круга, поскольку я предполагал, что моя проблема была вызвана ленью Java. Но все равно безуспешно.
Circle carShape = new Circle();
ObjectBinding<Paint> colorObjectBinding = new ObjectBinding<Paint>() {
{
super.bind(car.getSpeed().getXProperty(),car.getSpeed().getYProperty(),car.getParameters().desiredSpeedProperty());
}
@Override
protected Paint computeValue() {
double speedX = car.getSpeed().getX();
double speedY = car.getSpeed().getY();
Color color = Color.hsb(Math.sqrt(speedX*speedX+speedY*speedY)*110/car.getParameters().getDesiredSpeed(),0.94,0.94,0.94);
return color;
}
};
carShape.fillProperty().bind(colorObjectBinding);
car.speed
имеет тип Vector2D
, который использует DoubleProperty
для хранения значений x и y вектора.
public class Vector2D implements Iterable<DoubleProperty>{
private DoubleProperty xProperty = new SimpleDoubleProperty(0);
private DoubleProperty yProperty = new SimpleDoubleProperty(0);
public DoubleProperty getXProperty() { return xProperty; }
public DoubleProperty getYProperty() { return yProperty; }
public double getX() { return xProperty.getValue(); }
public double getY() { return yProperty.getValue(); }
desiredSpeed
также является DoubleProperty
private DoubleProperty desiredSpeed = new SimpleDoubleProperty(0);
public double getDesiredSpeed() { return desiredSpeed.get(); }
Я хочу, чтобы цвет машины менялся соответственно с изменением скорости. Но Круги окрашиваются только один раз при создании в красный цвет (0xf00e0ef0)
(что я подозреваю, потому что начальная скорость равна нулю, что дает оттенок = 0, для которого красный цвет)
Обновление
Я нашел свою ошибку, проблема была в методе car.getSpeed()
public Vector2D getSpeed() { return new Vector2D(speed); }
Который, как вы можете видеть, возвращает копию объекта скорости, который затем связывается, что, конечно, не имеет смысла, поскольку копия, скорее всего, никогда не будет изменена или использована снова. :(: 0