英文:
Ball that fades away as it goes to the right
问题
import javafx.application.Application;
import javafx.scene.Scene;
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());
double opacity = ball.getCenterX() / root.getWidth(); // Convert position to opacity value
ball.setOpacity(opacity);
});
return root;
}
}
英文:
My task is to write a program that makes a circle ball that gradually fades away as the ball moves to the right. But it's not working, I can make the ball move when the mouse is dragged but the opacity is the same. Can you guys help me? I don't know how to convert the opacity value into double
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
首先,将绑定操作移出事件处理程序。绑定操作将确保当centerX
属性更新时,不透明度始终会被更新。
其次,不要设置绑定的值;事件处理程序的最后两行只是将不透明度设置为其当前值。
第三,不透明度应该在0和1之间。当centerX
为0时,希望不透明度为1,当centerX
为300时(或者通常是面板的宽度),希望不透明度为0。
你所需要的是(伪代码):
<!-- language: none -->
opacity = 1 - ball.centerX / root.width
= (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;
}
英文:
First, move the binding out of the event handler. The binding will ensure the opacity is always updated when the centerX
property updates.
Second, don't set bound values; the last two lines of the event handler just set the opacity to its current value anyway.
Third, the opacity should be between 0 and 1. You want it to be 1 when centerX
is 0 and 0 when centerX
is 300 (or, generally, the width of the pane).
What you need is (in pseudocode)
<!-- language: none -->
opacity = 1 - ball.centerX / root.width
= (ball.centerX / root.width) * (-1) + 1
which you can express in bindings with
ball.centerXProperty()
.divide(root.widthProperty())
.multiply(-1)
.add(1)
So put together, you need:
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;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论