package Lect40CustomWidget; import java.awt.*; import java.awt.geom.*; import java.awt.event.*; import javax.swing.*; // This custom widget draws a red square, but the position of // that square is controllable through keyboard input via the arrow keys. public class MovableRedSquareWidget extends JComponent { private Rectangle2D.Double rect; public MovableRedSquareWidget() { addKeyListener(new MovableRedSquareListener(this)); setBackground(Color.WHITE); rect = new Rectangle2D.Double(50, 50, 50, 50); } 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(); } // JComponents don't usually get keyboard focus, so to make it possible for them to, // we have to override this method. public boolean isFocusTraversable() { return true; } 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); } } // Respond to key events to move red square around class MovableRedSquareListener implements KeyListener { private MovableRedSquareWidget widget; public MovableRedSquareListener(MovableRedSquareWidget widget) { this.widget = widget; } public void keyPressed(KeyEvent e) { int x = widget.getSquareX(); int y = widget.getSquareY(); switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: widget.setSquareX(x - 1); break; case KeyEvent.VK_RIGHT: widget.setSquareX(x + 1); break; case KeyEvent.VK_UP: widget.setSquareY(y - 1); break; case KeyEvent.VK_DOWN: widget.setSquareY(y + 1); break; } } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} }