I want to create a pop-up menu, which will appear if i right clicked on the canvas . How can I do this? which function should i modify? Any help would be appreciated.
Following code will create a popup menu when right-clicking either on the vertex or on the canvas...
/**
* a GraphMousePlugin that offers popup
* menu support
*/
protected class PopupGraphMousePlugin extends AbstractPopupGraphMousePlugin
implements MouseListener {
public PopupGraphMousePlugin() {
this(MouseEvent.BUTTON3_MASK);
}
public PopupGraphMousePlugin(int modifiers) {
super(modifiers);
}
/**
* If this event is over a station (vertex), pop up a menu to
* allow the user to perform a few actions; else, pop up a menu over the layout/canvas
*
* @param e
*/
protected void handlePopup(MouseEvent e) {
final VisualizationViewer<GeoLocation.Station,GeoLocation.Link> vv =
(VisualizationViewer<GeoLocation.Station,GeoLocation.Link>)e.getSource();
final Point2D p = e.getPoint();
final Point2D ivp = p;
GraphElementAccessor<GeoLocation.Station,GeoLocation.Link> pickSupport = vv.getPickSupport();
if(pickSupport != null) {
JPopupMenu popup = new JPopupMenu();
final GeoLocation.Station station = pickSupport.getVertex(vv.getGraphLayout(), ivp.getX(), ivp.getY());
if(station != null) {
boolean isRadio = station.getParentSet().contains(STATION_IDENTIFIER_KEY);
if(isRadio)
if (station.getId().equalsIgnoreCase(SneakPeek.getUsername())){
String follow = "Follow " + station.getId();
if (followLocal){
follow = "Do not follow " + station.getId();
}
else {
follow = "Follow " + station.getId();
}
popup.add(new AbstractAction("<html><center>" + follow) {
public void actionPerformed(ActionEvent e) {
followLocal = !followLocal;
}
});
}
if(popup.getComponentCount() > 0) {
popup.show(vv, e.getX(), e.getY());
}
}
}
else { //to pop-up over the canvas/layout rather than over the station
popup.add(new AbstractAction("Create Unit") {
public void actionPerformed(ActionEvent e) {
//do something here
}
});
if(popup.getComponentCount() > 0) {
popup.show(vv, e.getX(), e.getY());
}
}
}
}
Add the class into an AbstractModalGraphMouse
class which handles mouse listeners to make it work:
private AbstractModalGraphMouse graphMouse;
...
graphMouse = new DefaultModalGraphMouse<Object, Object>();
vvMap.setGraphMouse(graphMouse);
graphMouse.add(new PopupGraphMousePlugin());
The codes above do work. But, if you use different user data for the generic parts, then you need to modify the codes to suit your design.
protected class PopupGraphMousePlugin extends AbstractPopupGraphMousePlugin implements MouseListener {
public PopupGraphMousePlugin() {
this(MouseEvent.BUTTON3_MASK);
}
public PopupGraphMousePlugin(int modifiers) {
super(modifiers);
}
/**
* If this event is over a station (vertex), pop up a menu to
* allow the user to perform a few actions; else, pop up a menu over the layout/canvas
*
* @param e
*/
@SuppressWarnings("unchecked")
protected void handlePopup(MouseEvent e) {
final VisualizationViewer<String,String> vv =(VisualizationViewer<String,String>)e.getSource();
final Point2D p = e.getPoint();
final Point2D ivp = p;
JPopupMenu popup = new JPopupMenu();
System.out.println("mouse event!");
GraphElementAccessor<String,String> pickSupport = vv.getPickSupport();
System.out.println("GraphElementAccessor!");
if(pickSupport != null) {
final String pickV = pickSupport.getVertex(vv.getGraphLayout(), ivp.getX(), ivp.getY());
if(pickV != null) {
System.out.println("pickVisnotNull");
popup.add(new AbstractAction("Add New") {
/**
*
*/
public void actionPerformed(ActionEvent e) {
System.out.println("person added");
}
});//new abstraction
}
}///if picksupport
}//handlePopup(MouseEvent e)
}//PopupGraphMousePlugin
thats the one from your 1st code
this is the 2nd part
/Next, let's just build a simple mouse, to allow picking, translating, and zooming.
AbstractModalGraphMouse gMouse = new DefaultModalGraphMouse<Object, Object>();
vv.setGraphMouse(gMouse); //Add the mouse to our Visualization-Viewer.
//PluggableGraphMouse pgm = new PluggableGraphMouse();
gMouse.add(new PickingGraphMousePlugin<Object, Object>());
//pgm.add(new TranslatingGraphMousePlugin(MouseEvent.BUTTON3_MASK));
gMouse.add(new PopupGraphMousePlugin());
gMouse.add(new ScalingGraphMousePlugin(new CrossoverScalingControl(), 0, 1 / 1.1f, 1.1f));
This isn't particularly a JUNG question--the canvas is just a standard-issue Swing canvas with some additional capability grafted on, and you're not clicking on a graph element--but GraphEditorDemo and PluggableRendererDemo demonstrate something similar.
protected void handlePopup(MouseEvent e) {
final VisualizationViewer<Integer,Number> vv = (VisualizationViewer<Integer,Number>)e.getSource();
Point2D p = e.getPoint();
//vv.getRenderContext().getBasicTransformer().inverseViewTransform(e.getPoint());
GraphElementAccessor<Integer,Number> pickSupport = vv.getPickSupport();
if(pickSupport != null) {
System.out.println("POPUP MOUSE is not NULL!");
final Integer v = pickSupport.getVertex(vv.getGraphLayout(), p.getX(), p.getY());
if(v != null) {
JPopupMenu popup = new JPopupMenu();
popup.add(new AbstractAction("Decrease Transparency") {
public void actionPerformed(ActionEvent e) {
Double value = Math.min(1,transparency.get(v).doubleValue()+0.1);
transparency.put(v, value);//vertex, value
vv.repaint();
}
});
popup.add(new AbstractAction("Increase Transparency"){
public void actionPerformed(ActionEvent e) {
Double value = Math.max(0,
transparency.get(v).doubleValue()-0.1);
transparency.put(v, value);
vv.repaint();
}
});
popup.show(vv, e.getX(), e.getY());
}
else {
final Number edge = pickSupport.getEdge(vv.getGraphLayout(), p.getX(), p.getY());
if(edge != null) {
JPopupMenu popup = new JPopupMenu();
popup.add(new AbstractAction(edge.toString()) {
public void actionPerformed(ActionEvent e) {
System.err.println("got "+edge);
}
});//popup.add
popup.show(vv, e.getX(), e.getY());
}//if edge != null)
}
}// if(pickSupport != null)
//rightclicked on Canvas
else{
System.out.println("On Canvas!");
}
}//handlePopup(MouseEvent e)
来源:https://stackoverflow.com/questions/10544970/pop-up-menu-using-mouse-rightclick-in-jung