In this example, let’s see how to make a ball which bounces back when it reaches the borders of the application:
package com.example.testjavafx; import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.Pane; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.stage.Stage; import javafx.util.Duration; public class BallBounce extends Application { private static final int WIDTH = 800; private static final int HEIGHT = 600; private static final int RADIUS = 30; private static final int SPEED = 5; private double dx = SPEED; private double dy = SPEED; @Override public void start(Stage primaryStage) { Circle ball = new Circle(RADIUS, Color.BLUE); ball.setLayoutX(100); ball.setLayoutY(100); Pane root = new Pane(ball); Scene scene = new Scene(root, WIDTH, HEIGHT); primaryStage.setScene(scene); primaryStage.setResizable(false); primaryStage.show(); Timeline timeline = new Timeline( new KeyFrame(Duration.millis(20), e -> { calculatePosition(ball); }) ); timeline.setCycleCount(Animation.INDEFINITE); timeline.play(); } private void calculatePosition(Circle ball) { ball.setLayoutX(ball.getLayoutX() + dx); ball.setLayoutY(ball.getLayoutY() + dy); if (ball.getLayoutX() <= RADIUS || ball.getLayoutX() >= WIDTH - RADIUS) { dx = -dx; } if (ball.getLayoutY() <= RADIUS || ball.getLayoutY() >= HEIGHT - RADIUS) { dy = -dy; } } public static void main(String[] args) { launch(args); } }
A red Circle
object is created with a radius of 30 pixels. The Circle
is then added to a Pane
, which is set as the root node of a Scene
with a width of 800 pixels and a height of 600 pixels. The Timeline
animation updates the position of the ball on the Pane
based on the current coordinates dx
and dy
values, which are initially set to 5 pixels per animation frame. If the ball hits the edge of the Scene
, the dx
or dy
value is reversed to simulate a bounce.