2012-05-11 32 views

回答

1

下面的代码将创建时右击无论是在顶点或画布上的弹出菜单......

/** 
* 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()); 
      } 
     } 

    } 
} 

添加类为AbstractModalGraphMouse类处理鼠标监听器,使其工作:

private AbstractModalGraphMouse graphMouse; 
... 
graphMouse = new DefaultModalGraphMouse<Object, Object>(); 
vvMap.setGraphMouse(graphMouse); 
graphMouse.add(new PopupGraphMousePlugin()); 

上面的代码可以工作。但是,如果对通用零件使用不同的用户数据,则需要修改代码以适应您的设计。

+0

谢谢。会研究这个代码并且更新出来! –

+0

btw,如何从jung库读取java文件?我的意思是,之前,我学习C++(visual basic),并且我可以右键单击任何函数,并打开源文件以查看引擎盖下的工作情况(该函数的代码)。我不知道我怎么可以用java(即时通讯使用eclipse)做同样的事情?它说源未找到。 –

+0

也,鼠标弹出dowest工作,它运行,但当我按右键单击时弹出。 –

0

这不是一个特别的JUNG问题 - 画布只是一个标准问题的Swing画布,其中一些额外的功能已移植,而您没有单击图形元素 - 但GraphEditorDemo和PluggableRendererDemo展示了类似的东西。

+0

是的,我已经看到GraphEditorDemo,但似乎创建顶点弹出菜单不在同一个文件中。我找不到代码中的“创建顶点”jpopup菜单的实现。 –

+0

顺便说一句,我如何从jung库中读取java文件?我的意思是,之前,我学习C++(visual basic),并且我可以右键单击任何函数,并打开源文件以查看引擎盖下的工作情况(该函数的代码)。我不知道我怎么可以用java(即时通讯使用eclipse)做同样的事情?它说源未找到。 –

2
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 

这就是从您的第一代码的一个

这是第二部分

/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)); 
+0

几乎在那里,但你忘记了包括显示弹出式菜单'popup.show(vv,e.getX(),e.​​getY());' – ecle

+0

@eee 谢谢!现在它工作! –

0
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) 
+0

@eee 可以请你检查一下为什么这样做的工作,当我右键单击画布上。虚拟文本没有显示。代码来自PluggableRendererDemo,即时尝试修改。 –

+0

@Joshua O'Madadhain 请你检查一下代码为什么当我点击画布时无法工作? –

+0

nvm。问题解决了。 –

相关问题