Implement a Right-Click event

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);
}

}

No comments:

Post a Comment