import javax.swing.*; 
import javax.swing.event.MouseInputAdapter; 
import java.awt.*; 
import java.awt.event.MouseEvent; 
 
/** 
 * GlassPane tutorial 
 * "A well-behaved GlassPane" 
 * http://weblogs.java.net/blog/alexfromsun/ 
 * <p/> 
 * This the initial version of GlassPane mostly copied from    
 * http://java.sun.com/docs/books/tutorial/uiswing/components/rootpane.html 
 *  
 * @author Alexander Potochkin 
 */  
public class InitialGlassPane extends JPanel { 
    private Point point; 
 
    public InitialGlassPane(JFrame frame) { 
        super(null); 
        setOpaque(false); 
        MouseEventRedispatcher listener = new MouseEventRedispatcher(this, frame.getLayeredPane()); 
        addMouseListener(listener); 
        addMouseMotionListener(listener); 
    } 
 
    public void setPoint(Point point) { 
        this.point = point; 
    } 
 
    protected void paintComponent(Graphics g) { 
        Graphics2D g2 = (Graphics2D) g; 
        g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); 
        g2.setColor(Color.RED); 
        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(); 
    } 
 
    class MouseEventRedispatcher extends MouseInputAdapter { 
        private final InitialGlassPane glassPane; 
        private final Container contentPane; 
 
 
        public MouseEventRedispatcher(InitialGlassPane glassPane, Container contentPane) { 
            this.glassPane = glassPane; 
            this.contentPane = contentPane; 
        } 
 
        public void mouseMoved(MouseEvent e) { 
            redispatchMouseEvent(e, true); 
        } 
 
        public void mouseDragged(MouseEvent e) { 
            redispatchMouseEvent(e, true); 
        } 
 
        public void mouseClicked(MouseEvent e) { 
            redispatchMouseEvent(e, true); 
        } 
 
        public void mouseEntered(MouseEvent e) { 
            redispatchMouseEvent(e, true); 
        } 
 
        public void mouseExited(MouseEvent e) { 
            redispatchMouseEvent(e, true); 
        } 
 
        public void mousePressed(MouseEvent e) { 
            redispatchMouseEvent(e, true); 
        } 
 
        public void mouseReleased(MouseEvent e) { 
            redispatchMouseEvent(e, true); 
        } 
 
        //A more finished version of this method would 
        //handle mouse-dragged events specially. 
        private void redispatchMouseEvent(MouseEvent e, 
                                          boolean repaint) { 
            Point glassPanePoint = e.getPoint(); 
            Container container = contentPane; 
            Point containerPoint = SwingUtilities.convertPoint(glassPane, 
                    glassPanePoint, 
                    contentPane); 
            //The mouse event is probably over the content pane. 
            //Find out exactly which component it's over.   
            Component component = 
                    SwingUtilities.getDeepestComponentAt(container, 
                            containerPoint.x, 
                            containerPoint.y); 
 
            if (component != null) { 
                //Forward events 
                Point componentPoint = SwingUtilities.convertPoint(glassPane, 
                        glassPanePoint, 
                        component); 
                component.dispatchEvent(new MouseEvent(component, 
                        e.getID(), 
                        e.getWhen(), 
                        e.getModifiers(), 
                        componentPoint.x, 
                        componentPoint.y, 
                        e.getClickCount(), 
                        e.isPopupTrigger())); 
            } else { 
                glassPanePoint = null; 
            } 
         
            //Update the glass pane if requested. 
            if (repaint) { 
                glassPane.setPoint(glassPanePoint); 
                glassPane.repaint(); 
            } 
        } 
    } 
}