2012-09-27 2 views
5

Je veux mettre des points dans mon application avec un clic de souris. J'utilise JFreeChart et l'utilise dans l'écouteur souris ChartPanel. C'est ressembler à ceci:Transformer auditeur coordonnées de la souris en coordonnées tableau

panel.addChartMouseListener(new ThisMouseListener()); 
(il est pas fini)

et mon écouteur de souris ThisMouseListener():

class ThisMouseListener implements ChartMouseListener{ 

    @Override 
    public void chartMouseClicked(ChartMouseEvent event) { 
     int x = event.getTrigger().getX(); 
     int y = event.getTrigger().getY(); 

     System.out.println("X :" + x + " Y : " + y); 

     ChartEntity entity = event.getEntity(); 
     if(entity != null && (entity instanceof XYItemEntity)){ 
      XYItemEntity item = (XYItemEntity)entity; 
     } 
     new JOptionPane().showMessageDialog(null, "Hello", "Mouse Clicked event", JOptionPane.OK_OPTION); 
    } 

    @Override 
    public void chartMouseMoved(ChartMouseEvent arg0) { 
     // TODO Auto-generated method stub 

    } 

} 

mais cet écouteur de souris me retourne mes coordonnées du panneau et je veux obtenir les coordonnées de mon tableau. Peut être que je dois utiliser l'écouteur avec un autre objet? ou je peux transformer les coordonnées avec une méthode?

+0

Souhaitez-vous _add_ nouveaux points ou _select_ existants? Veuillez éditer votre question pour inclure un [sscce] (http://sscce.org/) qui montre votre approche actuelle. – trashgod

Répondre

3

ajouté l'auditeur au panneau. Par conséquent, lorsque vous cliquez sur la souris, vous recevez des coordonnées relatives au panneau - qui est la source de l'événement. Vous devez ajouter cet écouteur au graphique à la place.

Autre possibilité est d'obtenir les coordonnées de la carte en ce qui concerne le panneau et les soustraire de x et y. Si le panneau est le conteneur du composant de graphique, votre solution peut ressembler à celle du diagramme ci-dessus. Notez que ces coordonnées seront coordonnées par rapport au coin supérieur gauche du graphique.

+1

Ce ne serait pas un peu fragile? Il semble que vous deviez travailler à l'intérieur du moteur de rendu pour obtenir une géométrie fiable. – trashgod

+0

que voulez-vous dire par fragile? Pensez-vous qu'il pourrait tomber en panne à un moment donné? Par le moteur de rendu voulez-vous dire la fonction chartMouseClicked() dans l'auditeur (je pense que vous dire ce -http: //docs.oracle.com/javaee/5/api/javax/faces/render/Renderer.html)? J'ai omis la déclaration de x et y non parce que je suggère de l'inclure dans la fonction cliquée par la souris, mais de noter la source de ces variables. – user1581900

+0

Je voulais dire fragile dans le sens où les coordonnées relatives au diagramme peuvent changer, tandis que le moteur de rendu peut utiliser l'axe pour convertir les coordonnées de l'écran et du modèle. – trashgod

2

Obtenez le coordonnées x, y dans votre espace graphique via

double x = event.getChart().getXYPlot().getDomainCrosshairValue(); 
double y = event.getChart().getXYPlot().getRangeCrosshairValue(); 

Un problème majeur: je trouve que JFreeChart ne met pas à jour ces valeurs jusqu'à ce que après mon gestionnaire de ChartMouseEvent est appelé; chaque fois que je reçois les valeurs précédentes. Vous pouvez regarder XYPlot.handleClick (x, y, info) pour plus de détails pour obtenir les valeurs actuelles dans votre gestionnaire.

1

Vous devez obtenir une référence au ChartPanel, rredraw et seulement après que vous pouvez obtenir un bon coordonnées X, Y du terrain. Pour ce faire, vous devez placer la récupération des coordonnées dans la file d'attente awt et ne pas l'appeler directement. Voici un exemple qui a fonctionné pour moi (pour la coordonnée X seulement)

@Override 
public void chartMouseClicked(ChartMouseEvent cme) { 
    final ChartMouseEvent cmeLocal = cme; 
    ChartPanel hostChartPanel = (ChartPanel) cme.getTrigger().getComponent(); 
    if (null != hostChartPanel) { 

     //Crosshair values are not valid until after the chart has been updated 
     //that is why call repaint() now and post Crosshair value retrieval on the 
     //awt thread queue to get them when repaint() is finished 
     hostChartPanel.repaint(); 

     java.awt.EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFreeChart chart = cmeLocal.getChart(); 
       XYPlot plot = chart.getXYPlot(); 
       double crossHairX = plot.getDomainCrosshairValue(); 
       JOptionPane.showMessageDialog(null, Double.toString(crossHairX), "X-Value", JOptionPane.OK_OPTION); 
      } 
     }); 
    } 
} 
Questions connexes