import javax.swing.*; 
import java.awt.*; 
import java.awt.event.AWTEventListener; 
import java.awt.event.MouseEvent; 
 
/** 
 * GlassPane tutorial 
 * "A well-behaved GlassPane" 
 * http://weblogs.java.net/blog/alexfromsun/ 
 * <p/>
 * This is a much better version of GlassPane 
 * because it is really transparent for MouseEvents,  
 * the only drawback that it doesn't update the mouse's cursor 
 * for the components underneath  
 * (e.g. doesn't show TEXT_CURSOR for textComponents) 
 *  
 * @author Alexander Potochkin 
 */  
 
public class BetterGlassPane extends JPanel implements AWTEventListener { 
    private final JFrame frame; 
    private Point point = new Point(); 
 
    public BetterGlassPane(JFrame frame) { 
        super(null); 
        this.frame = frame; 
        setOpaque(false); 
    } 
 
    public void setPoint(Point point) { 
        this.point = point; 
    } 
 
    protected void paintComponent(Graphics g) { 
        Graphics2D g2 = (Graphics2D) g; 
        g2.setColor(Color.ORANGE); 
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.7f)); 
        int d = 22;  
        g2.fillRect(getWidth() - d, 0, d, d); 
        if (point != null) {             
            g2.fillOval(point.x + d, point.y + d, d, d); 
        } 
        g2.dispose(); 
    } 
 
    public void eventDispatched(AWTEvent event) { 
        if (event instanceof MouseEvent) { 
            MouseEvent me = (MouseEvent) event; 
            if (!SwingUtilities.isDescendingFrom(me.getComponent(), frame)) { 
                return; 
            } 
            if (me.getID() == MouseEvent.MOUSE_EXITED && me.getComponent() == frame) { 
                point = null; 
            } else { 
                MouseEvent converted = SwingUtilities.convertMouseEvent(me.getComponent(), me, frame.getGlassPane()); 
                point = converted.getPoint(); 
            } 
            repaint(); 
        } 
    } 
}