2011-04-14 9 views
0

Y at-il un moyen d'obtenir la coordonnée de vertex en utilisant le EditingModalGraphMouse dans Jung ?? J'ai créé une classe pour le vertex avec le setter de coordonnées et le getter mais je ne sais pas comment définir le vertex avec sa coordonnée spécifique. (je l'ai utilisateur un transformateur: Transformateur)Comment obtenir une coordonnée vertex dans JUNG?

Répondre

0

Ce qui suit vous donne une idée sur la façon d'obtenir les coordonnées cartésiennes sur une instance Jung VisualizationViewer ...

Créer une classe interne comme suit:

protected class MyGraphMousePlugin extends TranslatingGraphMousePlugin implements MouseListener { 

    @Override 
    public void mouseMoved(MouseEvent e) { 
     final VisualizationViewer<GeoLocationData.Station,GeoLocationData.Link> vv = 
     (VisualizationViewer<GeoLocationData.Station,GeoLocationData.Link>)e.getSource(); 
     Point2D p = e.getPoint();//vv.getRenderContext().getBasicTransformer().inverseViewTransform(e.getPoint()); 
     GraphElementAccessor<GeoLocationData.Station,GeoLocationData.Link> pickSupport = vv.getPickSupport(); 
     if(pickSupport != null) {    
      vv.setToolTipText ("<html>x: "+p.getX()+"<br>y: "+p.getY()); 
     } 
    } 

    public MyGraphMousePlugin(int modifiers) { 
     super(modifiers); 
     // TODO Auto-generated constructor stub 
    } 

    public MyGraphMousePlugin() { 
     super(); 
    } 
} 

Ajouter le plugin à votre instance GraphMouse:

graphMouse = new DefaultModalGraphMouse<Object, Object>(); 
vv.setGraphMouse(graphMouse); 
vv.addKeyListener(graphMouse.getModeKeyListener()); 
graphMouse.add(new MyGraphMousePlugin()); 

Modifié:

modification suivante vous donnera les coordonnées cartésiennes qui prennent en compte la traduction faite sur une mise en page graphique Jung:

protected class MyGraphMousePlugin extends TranslatingGraphMousePlugin implements MouseListener { 

    @Override 
    public void mouseMoved(final MouseEvent e) { 

     SwingUtilities.invokeLater(
       new Runnable() { 
        public void run() { 
         final VisualizationViewer<GeoLocationData.Station,GeoLocationData.Link> vv = 
          (VisualizationViewer<GeoLocationData.Station,GeoLocationData.Link>)e.getSource(); 
         Point2D p = e.getPoint();//vv.getRenderContext().getBasicTransformer().inverseViewTransform(e.getPoint()); 
         GraphElementAccessor<GeoLocationData.Station,GeoLocationData.Link> pickSupport = vv.getPickSupport(); 
         if(pickSupport != null) { 

          AffineTransform lat = 
           vv.getRenderContext().getMultiLayerTransformer().getTransformer(Layer.LAYOUT).getTransform(); 
          //AffineTransform vat = 
          // vv.getRenderContext().getMultiLayerTransformer().getTransformer(Layer.VIEW).getTransform(); 
          //AffineTransform at = new AffineTransform(); 

          double x = p.getX() - lat.getTranslateX(); //; 
          double y = p.getY() - lat.getTranslateY(); //; 

          vv.setToolTipText ("<html>x: "+x+"<br>y: "+y); 
         } 

        } 
       } 
     ); 
    } 

    public MyGraphMousePlugin(int modifiers) { 
     super(modifiers); 
     // TODO Auto-generated constructor stub 
    } 

    public MyGraphMousePlugin() { 
     super(); 
    } 
} 

Il est pas encore parfait, car il omet le facteur d'échelle, mais vous aurez l'idée ...

Vous devez calculer, à partir du système de coordonnées de l'écran, le système de coordonnées de vue jusqu'au système de coordonnées du modèle pour obtenir les coordonnées du modèle.

Les types génériques dans les codes ci-dessus doivent être modifiés à votre propre version :)

Edité

Haha, l'indice est déjà là et il est la bonne façon ... pas besoin de calculer! http://sourceforge.net/projects/jung/forums/forum/252062/topic/3040266?message=6522779

@Override 
    public void mouseMoved(final MouseEvent e) { 

     SwingUtilities.invokeLater(
       new Runnable() { 
        public void run() { 
         final VisualizationViewer<GeoLocationData.Station,GeoLocationData.Link> vv = 
          (VisualizationViewer<GeoLocationData.Station,GeoLocationData.Link>)e.getSource(); 
         Point2D p = vv.getRenderContext().getMultiLayerTransformer().inverseTransform(e.getPoint()); 

         double x = p.getX(); 
         double y = p.getY(); 

         vv.setToolTipText ("<html>x: "+(int)x+"<br>y: "+(int)y); 
        } 
       } 
     ); 
    } 
+0

Merci beaucoup :) Je l'ai essayé avec le editingGraphMousePlugin aussi fonctionne parfaitement :) En fait, je me demandais est possible d'obtenir les coordonnées lors de l'ajout du sommet de cinque le editingmodalgraphMouse (i ai déjà mis la setter et getter dans la vertex factory) – Jihath

+0

Je vise à avoir un fichier graphml contenant les x et y dès maintenant je pourrais obtenir le nom et sa couleur mais je n'ai pas trouvé le moyen de donner les informations x au setter – Jihath

+0

@eee Vos implémentations montrent les coordinares dans une info-bulle, mais existe-t-il un moyen de renvoyer les emplacements d'un sommet tels qu'ils apparaissent sur l'écran à un autre code? – CajunLuke

Questions connexes