import java.awt.AWTEvent; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.MouseInfo; import java.awt.Point; import java.awt.PointerInfo; import java.awt.RenderingHints; import java.awt.event.ComponentEvent; import javax.swing.JComponent; public class EyeComponent extends JComponent { private int width; private int height; private int eyeWidth; private int eyeHeight; private int EYE_RATIO = 5; private int MIN_SIZE = 1; private int MAX_SIZE = 50; public EyeComponent() { enableEvents(AWTEvent.COMPONENT_EVENT_MASK); } protected void processComponentEvent(ComponentEvent event) { if (event.getID() == ComponentEvent.COMPONENT_RESIZED) { Component comp = event.getComponent(); width = comp.getWidth(); height = comp.getHeight(); eyeWidth = width/EYE_RATIO; if (eyeWidth < MIN_SIZE) { eyeWidth = MIN_SIZE; } else if (eyeWidth > MAX_SIZE) { eyeWidth = MAX_SIZE; } eyeHeight = height/EYE_RATIO; if (eyeHeight < MIN_SIZE) { eyeHeight = MIN_SIZE; } else if (eyeHeight > MAX_SIZE) { eyeHeight = MAX_SIZE; } } super.processComponentEvent(event); } public void paintComponent(Graphics g) { Graphics2D g2d = (Graphics2D)g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); PointerInfo pointerInfo = MouseInfo.getPointerInfo(); Point absolute = pointerInfo.getLocation(); Point relative = traslatePointRelativeToComponent(absolute); int x; if (relative.x < 0) { x = 0; } else if (relative.x > width - eyeWidth) { x = width - eyeWidth; } else { x = relative.x; } int y; if (relative.y < 0) { y = 0; } else if (relative.y > height - eyeHeight) { y = height - eyeHeight; } else { y = relative.y; } g.setColor(Color.BLACK); g.fillOval(x, y, eyeWidth, eyeHeight); } private Point traslatePointRelativeToComponent(Point absolute) { Point compCoords = getLocationOnScreen(); return new Point(absolute.x - compCoords.x, absolute.y - compCoords.y); } }