Мяч, который исчезает, когда идет вправо - PullRequest
1 голос
/ 10 апреля 2020

Моя задача - написать программу, которая создает круговой шар, который постепенно исчезает при движении вправо. Но это не работает, я могу заставить шар двигаться, когда мышь перетаскивают, но непрозрачность такая же. Ребята, вы можете мне помочь? Я не знаю, как преобразовать значение непрозрачности в двойной

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.scene.paint.Color;

public class Project3 extends Application
{
   public static void main(String[] args) {
      launch(args);
   }
   public void start(Stage primaryStage) {
      Pane root = createRootPane();
      Scene scene1 = new Scene(root);
      primaryStage.setScene(scene1);
      primaryStage.setTitle(" Hai Vo ");
      primaryStage.show();
   }
   public Pane createRootPane()
   {
      Circle ball = new Circle (100,50,25);
      Pane root = new Pane(ball);
      root.setMinSize(300,300); 
      root.setOnMouseDragged (
       event ->
       {
         double x = event.getX();
         ball.setCenterX(event.getX());
         ball.setCenterY(event.getY());
         ball.opacityProperty().bind(ball.centerXProperty());
         double opacity = ball.opacityProperty();
         ball.setOpacity(opacity);
       } );
       return root;   
   }
}

1 Ответ

2 голосов
/ 10 апреля 2020

Сначала удалите привязку из обработчика событий. Привязка гарантирует, что непрозрачность всегда обновляется при обновлении свойства 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;   
 }
...