Java-javaFx库运用-自动弹跳的球

(1)定义一个名为BallPane的类,用于显示一个弹动的球;

(2)定义一个名为BounceBallControl的类,用来使用鼠标动作控制弹球,当鼠标按下的时候动画暂停,当鼠标释放的时候动画恢复执行,按下Up/Down方向键的时候可以增加/减少动画的速度。

BallPane类:

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.beans.property.DoubleProperty;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.util.Duration;

public class BallPane extends Pane{
    private double radius = 20;
    private double x = radius, y = radius;
    private double dx = 1, dy = 1;
    private Circle circle = new Circle(x, y, radius);
    private Timeline animation;
    
    public BallPane() {
        circle.setStroke(Color.BLACK);
        circle.setFill(Color.ORANGE);
        getChildren().add(circle);
        
        animation = new Timeline(
                new KeyFrame(Duration.millis(50), e -> moveBall()));
        animation.setCycleCount(Timeline.INDEFINITE);
        animation.play();
    }
    
    public void play() {
        animation.play();
    }
    
    public void pause() {
        animation.pause();
    }
    
    public void increaseSpeed() {
        animation.setRate(animation.getRate() + 0.1);
    }
    
    public void decreaseSpeed() {
        animation.setRate(animation.getRate() > 0 ? animation.getRate() - 0.1 : 0);
    }
    
    public DoubleProperty rateProperty() {
        return animation.rateProperty();
    }
    
    protected void moveBall() {
        if(x < radius || x > getWidth() - radius) {
            dx *= -1;
        }
        if(y < radius || y > getHeight() - radius) {
            dy *= -1;
        }
        
        x += dx;
        y += dy;
        circle.setCenterX(x);
        circle.setCenterY(y);
    }
}

BounceBallControl类:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.input.KeyCode;
import javafx.stage.Stage;

public class BounceBallControl extends Application{

    @Override
    public void start(Stage primaryStage) throws Exception {
        BallPane ballPane = new BallPane();
        
        ballPane.setOnMousePressed(e -> ballPane.pause());
        ballPane.setOnMouseReleased(e -> ballPane.play());
        
        //控制速度
        ballPane.setOnKeyPressed(e -> {
            if(e.getCode() == KeyCode.UP) {
                ballPane.increaseSpeed();
            }
            else if(e.getCode() == KeyCode.DOWN) {
                ballPane.decreaseSpeed();
            }
        });
        
        Scene scene = new Scene(ballPane, 250, 150);
        primaryStage.setTitle("Bounce Ball Control");
        primaryStage.setScene(scene);
        primaryStage.show();
        
        //将输入焦点设置到ballPane上
        ballPane.requestFocus();
    }
    
    public static void main(String[] args) {
        Application.launch(args);
    }

}
原文地址:https://www.cnblogs.com/fredkeke/p/7841101.html