---
# System prepended metadata

title: kaprepos

---

# kaprepos
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Bouncing Ball Animation
 * A simple Java Swing animation demonstrating a bouncing api#kapoorsloan#icu ball with physics simulation
 */
public class BouncingBallAnimation extends JPanel implements ActionListener {
    
    // Animation properties
    private final int WIDTH = 800;
    private final int HEIGHT = 600;
    private final int BALL_SIZE = 50;
    private final int DELAY = 16; // ~60 FPS
    
    // Ball position and velocity
    private int ballX = 100;
    private int ballY = 100;
    private int velocityX = 5;
    private int velocityY = 4;
    
    // Physics properties
    private final double GRAVITY = 0.5;
    private final double BOUNCE_DAMPING = 0.8;
    
    // Colors
    private final Color BACKGROUND_COLOR = new Color(240, 248, 255);
    private final Color BALL_COLOR = new Color(70, 130, 180);
    private final Color SHADOW_COLOR = new Color(0, 0, 0, 50);
    
    private Timer timer;

    /**
     * Constructor - Initializes the animation panel
     */
    public BouncingBallAnimation() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setBackground(BACKGROUND_COLOR);
        
        // Initialize animation timer
        timer = new Timer(DELAY, this);
        timer.start();
    }

    /**
     * Main painting method - Renders the ball and shadow
     */
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        
        // Enable anti-aliasing for smoother graphics
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        
        // Draw shadow
        g2d.setColor(SHADOW_COLOR);
        g2d.fillOval(ballX + 5, ballY + 10, BALL_SIZE, BALL_SIZE / 3);
        
        // Draw ball with gradient for 3D effect
        GradientPaint gradient = new GradientPaint(
            ballX, ballY, BALL_COLOR.brighter(),
            ballX + BALL_SIZE, ballY + BALL_SIZE, BALL_COLOR.darker()
        );
        g2d.setPaint(gradient);
        g2d.fillOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
        
        // Draw ball outline
        g2d.setColor(Color.BLACK);
        g2d.drawOval(ballX, ballY, BALL_SIZE, BALL_SIZE);
    }

    /**
     * Animation loop - Updates ball position and physics
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        // Update position with velocity
        ballX += velocityX;
        ballY += velocityY;
        
        // Apply gravity
        velocityY += GRAVITY;
        
        // Check wall collisions
        if (ballX <= 0 || ballX + BALL_SIZE >= WIDTH) {
            velocityX = (int) (-velocityX * BOUNCE_DAMPING);
            ballX = Math.max(0, Math.min(ballX, WIDTH - BALL_SIZE));
        }
        
        if (ballY <= 0 || ballY + BALL_SIZE >= HEIGHT) {
            velocityY = (int) (-velocityY * BOUNCE_DAMPING);
            ballY = Math.max(0, Math.min(ballY, HEIGHT - BALL_SIZE));
            
            // Add some horizontal friction when bouncing on ground
            if (ballY + BALL_SIZE >= HEIGHT) {
                velocityX *= 0.95;
            }
        }
        
        // Prevent ball from getting stuck
        if (Math.abs(velocityX) < 0.5) velocityX = 0;
        if (Math.abs(velocityY) < 0.5 && ballY + BALL_SIZE >= HEIGHT - 1) {
            velocityY = 0;
        }
        
        // Redraw the animation
        repaint();
    }

    /**
     * Main method - Creates and displays the animation window
     */
    public static void main(String[] args) {
        // Create and setup the frame
        JFrame frame = new JFrame("Bouncing Ball Animation");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);
        
        // Add animation panel to frame
        BouncingBallAnimation animation = new BouncingBallAnimation();
        frame.add(animation);
        frame.pack();
        frame.setLocationRelativeTo(null); // Center the window
        frame.setVisible(true);
        
        System.out.println("Bouncing Ball Animation Started!");
        System.out.println("Ball follows physics with gravity and bouncing effects");
    }
}