2012-09-27 30 views
5

Quiero establecer puntos en mi aplicación con un clic del mouse. Uso JFreeChart y uso en el detector de mouse ChartPanel. Este es el siguiente aspecto:Transformar las coordenadas del oyente del mouse en las coordenadas del gráfico

panel.addChartMouseListener(new ThisMouseListener()); 

y mi detector de ratón ThisMouseListener() (que no está terminado):

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 

    } 

} 

pero esto detector de ratón me devuelve mis coordenadas del panel y quiero obtener coordenadas de mi carta ¿Puede ser que debo usar el oyente con otro objeto? o puedo transformar las coordenadas con algún método?

+0

¿Desea _agregar_ nuevos puntos o _seleccionar_ los existentes? Edite su pregunta para incluir un [sscce] (http://sscce.org/) que muestre su enfoque actual. – trashgod

Respuesta

3

Agregó el oyente al panel. Por lo tanto, cuando hace clic con el mouse, recibe las coordenadas relativas al panel, que es la fuente del evento. Necesita agregar este oyente al gráfico en su lugar.

Otra posibilidad es obtener coordenadas del gráfico con respecto al panel y restarlas de xey.

Point p = chart.getLocation();  
int px = p.getX(); 
int py = p.getY(); 

x = x-px; // x from event 
y = y-py; // y from event 
// x and y are now coordinates in respect to the chart 

if(x<0 || y<0 || x>chart.getWidth() || y>chart.getHeight()) // the click was outside of the chart 
else // the click happened within boundaries of the chart and 

Si el panel es el contenedor del componente de gráfico, su solución puede parecerse a la anterior. Tenga en cuenta que estas coordenadas serán coordenadas con respecto a la esquina superior izquierda de la tabla.

+1

¿No sería eso un poco frágil? Parece que tendrías que trabajar dentro del renderizador para obtener una geometría confiable. – trashgod

+0

¿qué quieres decir con frágil? ¿Crees que podría colapsar en algún momento? Por el representador ¿te refieres a la función chartMouseClicked() en el oyente (creo que te refieres a esto-http: //docs.oracle.com/javaee/5/api/javax/faces/render/Renderer.html)? Omití la declaración de xey no porque sugiero incluirla dentro de la función de clic del mouse, sino para anotar la fuente de esas variables. – user1581900

+0

Me refiero a quebradizo en el sentido de que las coordenadas relativas al gráfico pueden cambiar, mientras que el renderizador puede usar el eje para convertir entre las coordenadas de la pantalla y el modelo. – trashgod

2

Obtener el coordenadas x, y en su espacio gráfico a través de

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

Un problema importante: Me parece que JFreeChart no actualiza estos valores hasta después se llama mi manejador ChartMouseEvent; cada vez que obtengo los valores anteriores. Puede ver XYPlot.handleClick (x, y, info) para obtener detalles para obtener los valores actuales en su controlador.

1

Debes obtener una referencia al ChartPanel, corregirla y solo después de eso puedes obtener las coordenadas X, Y correctas del gráfico. Para hacerlo, debe colocar la recuperación de coordenadas en la cola AWT y no llamarla directamente. A continuación se muestra un ejemplo que funcionó para mí (solo para la coordenada X)

@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); 
      } 
     }); 
    } 
} 
Cuestiones relacionadas