将鼠标侦听器坐标转换为图表坐标



我想通过鼠标单击在我的应用程序中设置点。我使用JFreeChart并在ChartPanel鼠标侦听器中使用。这看起来像这样:

panel.addChartMouseListener(new ThisMouseListener());

和我的鼠标侦听器 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
    }
} 

但是这个鼠标侦听器向我返回我的面板坐标,我想从我的图表中获取坐标。可能我必须将侦听器与其他对象一起使用?或者我可以用某种方法转换坐标?

您已将侦听器添加到面板。因此,当您单击鼠标时,您会收到相对于面板的坐标 - 这是事件的来源。您需要改为将此侦听器添加到图表中。

另一种可能性是获取图表相对于面板的坐标,并从 x 和 y 中减去它们。

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 

如果面板是图表组件的容器,则解决方案可能类似于上面的解决方案。请注意,这些坐标将是相对于图表左上角的坐标。

通过以下方式获取图形空间中的 x,y 坐标

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

一个主要问题:我发现 JFreeChart 直到调用我的 ChartMouseEvent 处理程序才会更新这些值;每次通过我都会得到以前的值。 您可以查看 XYPlot.handleClick(x,y,info) 以获取详细信息,以获取处理程序中的当前值。

您必须获取对图表面板的引用,重新绘制它,然后才能从绘图中获得正确的 X,Y 坐标。为此,您必须将坐标检索放在 awt 队列上,而不是直接调用它。下面是一个对我有用的示例(仅适用于 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);
            }
        });
    }
}

相关内容

  • 没有找到相关文章

最新更新