2012-03-13 33 views
6

tôi đang cố gắng để có được tọa độ của điểm nhấp chuột trên một đồ thị biểu đồ phân tán.Làm thế nào để có được tọa độ của một điểm trên click chuột với JFreeChart?

Khi bạn bấm vào một điểm, "Click kiện!" và tọa độ được in trên bảng điều khiển. Khi bạn nhấn chuột vào nút "Test", "Test" và tọa độ được in trên bàn điều khiển.

Sự cố: Tọa độ được in sau khi nhấp vào nút được cập nhật. Các tọa độ in sau khi nhấp vào một điểm là một trong những điểm đã chọn trước đó.

Làm thế nào tôi có thể khắc phục điều đó (vì vậy khi tôi bấm vào một điểm, tọa độ của điểm mới chọn được hiển thị)?

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); 
      } 
     }); 
    } 
} 

Trả lời

5

tôi đoán là người biết lắng nghe con chuột của bạn được gọi trước (nội bộ) JFreeCharts người nghe, do đó, điểm tóc chéo chưa được cập nhật khi mã của bạn thực hiện (trỏ đến vùng chọn trước đó). Đặt biểu đồ của bạnMouseClicked trong một invokeLater nên khắc phục điều đó.

0

Hãy thử chiết xuất từ ​​ChartMouseEvent e:

e.x 
e.y 
+0

Tôi đã thử 'e.getChart(). GetXYPlot(). GetDomainCrosshairValue()'. Cùng một vấn đề –

1

Vấn đề là việc vẽ lại biểu đồ cũng được kích hoạt bởi sự kiện chuột và do đó không đảm bảo rằng điều này đã kết thúc tại thời điểm trình xử lý sự kiện của bạn được kích hoạt.

Bạn nên nghe một điểm khác đảm bảo quá trình vẽ lại kết thúc. Bạn có thể sử dụng biểu đồProgressListener và lọc ra khi vẽ lại đã hoàn tất. Mã phù hợp không phải là rất thanh lịch và bạn có thể cần một số kiểm tra nhiều hơn, nhưng có vẻ như để thực hiện công việc:.

package graph; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.awt.event.ActionEvent; 
import java.awt.event.MouseEvent; 
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.entity.ChartEntity; 
import org.jfree.chart.event.*; 
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()); 

     } 
    })); 



    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.red); 
    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)); 
    final ChartPanel result = new ChartPanel(jfreechart); 

     jfreechart.addProgressListener(new ChartProgressListener() { 

     @Override 
     public void chartProgress(ChartProgressEvent cpe) { 
     if(cpe.getType()==ChartProgressEvent.DRAWING_FINISHED){ 
     System.out.println("Click event!"); 
     XYPlot xyPlot2 = result.getChart().getXYPlot(); 
     System.out.println(xyPlot2.getDomainCrosshairValue() + " " 
      + xyPlot2.getRangeCrosshairValue()); 
     } 
     } 
    }); 


    return result; 
    } 

    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); 
     } 
    }); 
    } 
} 
0

e.getTrigger() GetX()

làm việc cho tôi!

System.out.println(e.getTrigger().getX() + " " + e.getTrigger().getY()); 
Các vấn đề liên quan