我想点击鼠标在我的应用中设置点。我使用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
}
}
但是这个鼠标监听器会返回我的面板坐标,我想从我的图表中获取坐标。可能是我必须使用其他对象的监听器?或者我可以用某种方法变换坐标?
答案 0 :(得分:3)
您已将侦听器添加到面板中。因此,当您单击鼠标时,您会收到相对于面板的坐标 - 这是事件的来源。您需要将此侦听器添加到图表中。
其他可能性是获取图表相对于面板的坐标,并从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
如果面板是图表组件的容器,那么您的解决方案可能与上面的解决方案类似。请注意,这些坐标是相对于图表左上角的坐标。
答案 1 :(得分:2)
通过
获取图表空间中的x,y坐标double x = event.getChart().getXYPlot().getDomainCrosshairValue();
double y = event.getChart().getXYPlot().getRangeCrosshairValue();
一个主要问题:我发现JFreeChart在之后我的ChartMouseEvent处理程序被调用之前不会更新这些值;每次通过我得到以前的值。您可以查看XYPlot.handleClick(x,y,info)以获取详细信息以获取处理程序中的当前值。
答案 2 :(得分:1)
您必须获取ChartPanel的引用,然后再绘制它,然后才能从Plot中获得正确的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);
}
});
}
}