FileDocCategorySizeDatePackage
RightClickGlassPane.javaAPI DocExample4016Mon Jan 09 11:01:58 GMT 2006None

RightClickGlassPane.java

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RightClickGlassPane extends JComponent implements MouseListener, MouseMotionListener {

    protected JPopupMenu popup;
    protected Container contentPane;

    public RightClickGlassPane(Container contentPane, JPopupMenu menu) {
        addMouseListener(this);
        addMouseMotionListener(this);
        this.contentPane = contentPane;
        popup = menu;
    }

    // draw some text just so we know the glass pane
    // is installed and visible
    public void paint(Graphics g) {
        //g.drawString("I'm a glass pane",50,50);
    }


    // catch all mouse events and redispatch them
    public void mouseMoved(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }
    public void mouseDragged(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }
    public void mouseClicked(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }
    public void mouseEntered(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }
    public void mouseExited(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }
    public void mousePressed(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }
    public void mouseReleased(MouseEvent e) {
        redispatchMouseEvent(e, false);
    }

    public void showPopup(Component comp, int x, int y) {
        popup.show(comp,x,y);
    }

    protected void redispatchMouseEvent(MouseEvent e, boolean repaint) {

        // if it's a popup
        if(e.isPopupTrigger()) {
            // show the popup and return
            showPopup(e.getComponent(), e.getX(), e.getY());
        } else {
            doDispatch(e);
        }
    }
    
    protected Component getRealComponent(Point pt) {
        // get the mouse click point relative to the content pane
        Point containerPoint = 
            SwingUtilities.convertPoint(this, pt,contentPane);
    
        // find the component that under this point
        Component component = SwingUtilities.getDeepestComponentAt(
                    contentPane,
                    containerPoint.x,
                    containerPoint.y);
        return component;
    }
    protected void doDispatch(MouseEvent e) {
        // since it's not a popup we need to redispatch it.
    
        Component component = getRealComponent(e.getPoint());
    
        // return if nothing was found
        if (component == null) {
            return;
        }
    
        // convert point relative to the target component
        Point componentPoint = SwingUtilities.convertPoint(
            this,
            e.getPoint(),
            component);
    
        // redispatch the event
        component.dispatchEvent(new MouseEvent(component,
            e.getID(),
            e.getWhen(),
            e.getModifiers(),
            componentPoint.x,
            componentPoint.y,
            e.getClickCount(),
            e.isPopupTrigger()));
    }



    public static void main(String[] args) {
        // create a frame with some components in it
        JFrame frame = new JFrame("Right Click Test");
        JButton button = new JButton("this is a button");
        JTextField tf = new JTextField("this is a textfield");
        JPanel panel = new JPanel();
        panel.add(button);
        panel.add(tf);
        frame.getContentPane().add(panel);


        JPopupMenu popup = new JPopupMenu();
        popup.add(new JMenuItem("Dogs"));
        popup.add(new JMenuItem("Cats"));
        popup.add(new JMenuItem("Mass Hysteria"));

        // create the right click glass pane.
        Component rc = new RightClickGlassPane(frame.getContentPane(),popup);
        // set as glasspane and make it visible
        frame.setGlassPane(rc);
        rc.setVisible(true);

        // pack and show the frame
        frame.pack();
        frame.setSize(400,200);
        frame.show();
    }

    // utiltity function
    public static void p(String str) {
        System.out.println(str);
    }

}