Pop-up menu using mouse rightclick in JUNG

﹥>﹥吖頭↗ 提交于 2019-12-05 12:01:34

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)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!