Сначала удалите привязку из обработчика событий. Привязка гарантирует, что непрозрачность всегда обновляется при обновлении свойства centerX
.
Во-вторых, не устанавливайте привязанные значения; последние две строки обработчика событий просто устанавливают непрозрачность на ее текущее значение в любом случае.
В-третьих, непрозрачность должна быть между 0 и 1. Вы хотите, чтобы это было 1, когда centerX
равно 0 и 0, когда centerX
равно 300 (или, как правило, ширина панели).
Вам нужно (в псевдокоде)
opacity = 1 - ball.centerX / root.width
= (ball.centerX / root.width) * (-1) + 1
, которое вы можете express в привязках с
ball.centerXProperty()
.divide(root.widthProperty())
.multiply(-1)
.add(1)
Итак, вместе нужно:
public Pane createRootPane() {
Circle ball = new Circle (100,50,25);
Pane root = new Pane(ball);
ball.opacityProperty().bind(
ball.centerXProperty()
.divide(root.widthProperty())
.multiply(-1)
.add(1)
);
root.setMinSize(300,300);
root.setOnMouseDragged (
event ->
{
ball.setCenterX(event.getX());
ball.setCenterY(event.getY());
} );
return root;
}