Java 球向右转时逐渐消失

Java 球向右转时逐渐消失,java,javafx,opacity,Java,Javafx,Opacity,我的任务是编写一个程序,使一个圆球随着球向右移动而逐渐消失。但它不起作用,我可以在拖动鼠标时使球移动,但不透明度是相同的。你们能帮帮我吗?我不知道如何将不透明度值转换为双精度 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.Pane; import javafx.scene.shape.Ci

我的任务是编写一个程序,使一个圆球随着球向右移动而逐渐消失。但它不起作用,我可以在拖动鼠标时使球移动,但不透明度是相同的。你们能帮帮我吗?我不知道如何将不透明度值转换为双精度

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;   
   }
}

首先,将绑定移出事件处理程序。绑定将确保在
centerX
属性更新时始终更新不透明度

第二,不要设置界限值;事件处理程序的最后两行只是将不透明度设置为其当前值

第三,不透明度应介于0和1之间。当
centerX
为0时,您希望它为1;当
centerX
为300(或通常为窗格宽度)时,希望它为0

您需要的是(伪代码)

opacity=1-ball.centerX/root.width
=(球心/球根宽度)*(-1)+1
可以在绑定中使用

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;   
 }

在这一行中,
duble opacity=ball.opacityProperty()
,我认为您只需要修复拼写并可能对其进行类型转换:
double opacity=(double)ball.opacityProperty()哦,是的,我修复了它,但是关于转换的错误仍然是一样的。事件处理程序的最后两行没有任何意义,无论是否有拼写错误。您绑定了属性,因此在解除绑定属性之前无法直接赋值。你很可能会得到一个完全不透明的圆,因为不透明度的范围是
[0,1]
,而且向右移动会增加x值,因此根据最大x值缩放值后不透明度evne…好的,对不起,我学习速度慢,你是说我不应该把不透明度和x值绑定,因为不透明度在[0,1]之内,而x值可以无穷大?那你建议如何修复它呢?它就像一个符咒,你能给我解释一下“ball.opacityProperty……”这句话吗?它具体在做什么?它在玩弄什么价值观?对不起,我是新的编码,所以基本上,只是一个NoOB。@ HaiVo,如果它像一个魅力的工作,考虑答案。