Wie bekommt man die Koordinaten eines Punktes auf der Maus klicken Sie mit JFreeChart?
Ich versuche, die Koordinaten des Punktes mit der Maus angeklickt werden, die auf einen scatter-plot-Diagramm.
Wenn Sie auf einen Punkt, "Click-Ereignis!" und die Koordinaten werden auf der Konsole ausgegeben.
Wenn Sie klicken Sie auf die Schaltfläche "Test", "Test" und die Koordinaten werden auf der Konsole ausgegeben.
Problem: Die Koordinaten gedruckt nach Klick auf die Schaltfläche " up-to-date. Die Koordinaten gedruckt wird, nachdem Sie auf einen Punkt geklickt werden, die eine die vorher markierten Punkt.
Wie kann ich den Fehler beheben (also wenn ich auf einen Punkt, der die Koordinaten des neuen ausgewählten Punkt werden angezeigt) ?
package graph;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.util.Random;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
/**
* @see http://stackoverflow.com/questions/7231824
* @see http://stackoverflow.com/questions/7205742
* @see http://stackoverflow.com/questions/7208657
* @see http://stackoverflow.com/questions/7071057
*/
public class GraphFrameOld extends JFrame {
private static final int N = 32;
private static final String title = "Scatter Plot Pannel";
private static final Random rand = new Random();
private final XYSeries added = new XYSeries("Added");
private static XYPlot xyPlot;
public GraphFrameOld(String s) {
super(s);
final ChartPanel chartPanel = createGraphPanel();
this.add(chartPanel, BorderLayout.CENTER);
JPanel control = new JPanel();
control.add(new JButton(new AbstractAction("Add") {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < N; i++) {
added.add(rand.nextDouble(), rand.nextDouble());
}
}
}));
control.add(new JButton(new AbstractAction("Test") {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Test");
System.out.println(xyPlot.getDomainCrosshairValue() + " "
+ xyPlot.getRangeCrosshairValue());
}
}));
//add click event
chartPanel.addChartMouseListener(new ChartMouseListener() {
@Override
public void chartMouseClicked(ChartMouseEvent e) {
System.out.println("Click event!");
XYPlot xyPlot2 = chartPanel.getChart().getXYPlot();
//Problem: the coordinates displayed are the one of the previously selected point !
System.out.println(xyPlot2.getDomainCrosshairValue() + " "
+ xyPlot2.getRangeCrosshairValue());
}
@Override
public void chartMouseMoved(ChartMouseEvent arg0) {
}
});
this.add(control, BorderLayout.SOUTH);
}
private ChartPanel createGraphPanel() {
JFreeChart jfreechart = ChartFactory
.createScatterPlot(title, "X", "Y", createSampleData(),
PlotOrientation.VERTICAL, true, true, false);
xyPlot = (XYPlot) jfreechart.getPlot();
xyPlot.setDomainCrosshairVisible(true);
xyPlot.setRangeCrosshairVisible(true);
XYItemRenderer renderer = xyPlot.getRenderer();
renderer.setSeriesPaint(0, Color.blue);
NumberAxis domain = (NumberAxis) xyPlot.getDomainAxis();
domain.setRange(0.00, 1.00);
domain.setTickUnit(new NumberTickUnit(0.1));
domain.setVerticalTickLabels(true);
NumberAxis range = (NumberAxis) xyPlot.getRangeAxis();
range.setRange(0.0, 1.0);
range.setTickUnit(new NumberTickUnit(0.1));
return new ChartPanel(jfreechart);
}
private XYDataset createSampleData() {
XYSeriesCollection xySeriesCollection = new XYSeriesCollection();
XYSeries series = new XYSeries("Random");
for (int i = 0; i < N * N; i++) {
double x = rand.nextDouble();
double y = rand.nextDouble();
series.add(x, y);
}
xySeriesCollection.addSeries(series);
xySeriesCollection.addSeries(added);
return xySeriesCollection;
}
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
GraphFrameOld demo = new GraphFrameOld(title);
demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
demo.pack();
demo.setLocationRelativeTo(null);
demo.setVisible(true);
}
});
}
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Vermutung ist, dass Ihre Maus-listener wird aufgerufen, bevor die (interne) JFreeCharts-listener, so dass das Fadenkreuz Punkt ist noch nicht aktualisiert, wenn der code ausgeführt wird (Punkt nach der vorhergehenden Auswahl immer noch). Setzen Sie Ihre chartMouseClicked code in ein invokeLater sollte das beheben.
Das problem ist, dass das Neuzeichnen des Diagramms wird auch ausgelöst durch das Maus-Ereignis, und so ist es nicht gewährleistet, dass diese abgeschlossen hat, die zum Zeitpunkt der event-listener ausgelöst wird.
Sollten Sie hören ein weiterer Punkt, der garantiert das nachzeichnen ist beendet. Sie können die chartProgressListener und filter aus, wenn der Neuaufbau abgeschlossen ist. Der angepasste code ist nicht sehr elegant, und Sie müssen möglicherweise einige mehr überprüft, aber es scheint, um den job zu erledigen:
Extrahieren von ChartMouseEvent e:
e.getChart().getXYPlot().getDomainCrosshairValue()
. Gleiche probleme.getTrigger().getX()
arbeitete für mich!