package Lect41Applets; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; // This custom widget uses a timer to move the red square // many times per second, bouncing it off the widget edges public class AnimatedRedSquareWidget extends JComponent { private static final int STEPS_PER_SECOND = 40; private static final int SQUARE_WIDTH = 50; private static final int SQUARE_HEIGHT = 50; private int dx = 5; private int dy = 2; private Rectangle2D.Double rect; public AnimatedRedSquareWidget() { setBackground(Color.WHITE); rect = new Rectangle2D.Double(50, 50, SQUARE_WIDTH, SQUARE_HEIGHT); // Make the step method get called regularly through a timer callback TimerListener timerListener = new TimerListener(this); Timer timer = new Timer(1000 / STEPS_PER_SECOND, timerListener); timer.start(); } public void setSquareX(int x) { rect.setRect(x, rect.getY(), rect.getWidth(), rect.getHeight()); repaint(); // After model changes, force a repaint so view reflects updated model } public int getSquareX() { return (int)rect.getX(); } public void setSquareY(int y) { rect.setRect(rect.getX(), y, rect.getWidth(), rect.getHeight()); repaint(); // After model changes, force a repaint so view reflects updated model } public int getSquareY() { return (int)rect.getY(); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D)g; // First fill in background g2.setColor(getBackground()); g2.fill(new Rectangle2D.Double(0, 0, getWidth(), getHeight())); // Then draw foreground (red square) g2.setColor(Color.RED); g2.fill(rect); } public void step() { // First update square position int x = getSquareX(); int y = getSquareY(); x += dx; y += dy; setSquareX(x); setSquareY(y); // Then, make sure it stays within the widget borders bounceWithinFrame(); } public void bounceWithinFrame() { int x = getSquareX(); int y = getSquareY(); if ((x < 0) || ((x + SQUARE_WIDTH) > getWidth())) { dx *= -1; x += dx; } if ((y < 0) || ((y + SQUARE_HEIGHT) > getHeight())) { dy *= -1; y += dy; } setSquareX(x); setSquareY(y); } } class TimerListener implements ActionListener { AnimatedRedSquareWidget widget; public TimerListener(AnimatedRedSquareWidget widget) { this.widget = widget; } public void actionPerformed(ActionEvent evt) { widget.step(); } };