• 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);
        }
    
    }
  • 相关阅读:
    java8学习之Collector复合与注意事项
    动画学习之WIFI图形绘制
    java线程基础巩固---多线程死锁分析,案例介绍
    java8学习之Collector同一性与结合性分析
    java8学习之Collector源码分析与收集器核心
    java8学习之Stream分组与分区详解
    kotlin面向对象之抽象类、继承、多态
    matplotlib-曲线和折线案例
    人口、人口密度分析项目-条形图
    开机自启:bat实现一次性打开win7中的常用软件和文件夹
  • 原文地址:https://www.cnblogs.com/fredkeke/p/7841101.html
Copyright © 2020-2023  润新知