2013-04-02 184 views
2

是否有可能将GUID添加到散点图上的每个点,因此当用户点击点时,我可以处理GUID并检索一些信息?JfreeChart散点图点击弹出信息

编辑:添加样品:

package demo; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.EventQueue; 
import java.util.Random; 
import javax.swing.JFrame; 
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.XYItemEntity; 
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; 

public class ScatterMouseClick extends JFrame { 

    private static final long serialVersionUID = 1L; 
    private static final int N = 24; 
    private static final Random rand = new Random(System.currentTimeMillis()); 
    private final XYSeries series = new XYSeries("Scatter Series"); 

    public ScatterMouseClick(String s) { 
     super(s); 
     final ChartPanel chartPanel = createDemoPanel(); 
     this.add(chartPanel, BorderLayout.CENTER); 
    } 

    private ChartPanel createDemoPanel() { 
     JFreeChart jfreechart = ChartFactory.createScatterPlot(
      "Scatter Mouse click Demo", "X", "Y", createSampleData(), 
      PlotOrientation.VERTICAL, true, true, false); 
     XYPlot xyPlot = (XYPlot) jfreechart.getPlot(); 
     xyPlot.setDomainCrosshairVisible(true); 
     xyPlot.setRangeCrosshairVisible(true); 
     XYItemRenderer renderer = xyPlot.getRenderer(); 
     renderer.setSeriesPaint(0, Color.blue); 
     adjustAxis((NumberAxis) xyPlot.getDomainAxis(), true); 
     adjustAxis((NumberAxis) xyPlot.getRangeAxis(), false); 
     xyPlot.setBackgroundPaint(Color.white); 
     ChartPanel chartPanel = new ChartPanel(jfreechart); 
     chartPanel.addChartMouseListener(new ChartMouseListener() { 
      public void chartMouseClicked(ChartMouseEvent e) { 
       if (e.getEntity() instanceof XYItemEntity) { 
        XYItemEntity item = (XYItemEntity) e.getEntity(); 
        System.out.println("You clicked at point of series:[" 
         + item.getSeriesIndex() + "] at location: [" 
         + item.getItem() + "] with UTL Text: " 
         + item.getURLText()); 
       } 
      } 

      public void chartMouseMoved(ChartMouseEvent e) { 
      } 
     }); 
     return chartPanel; 
    } 

    private void adjustAxis(NumberAxis axis, boolean vertical) { 
     axis.setRange(-3.0, 3.0); 
     axis.setTickUnit(new NumberTickUnit(0.5)); 
     axis.setVerticalTickLabels(vertical); 
    } 

    private XYDataset createSampleData() { 
     XYSeriesCollection xySeriesCollection = new XYSeriesCollection(); 
     for (int i = 0; i < N * N; i++) { 
      //TODO HOW ADD URL text information here 
      series.add(rand.nextGaussian(), rand.nextGaussian()); 
     } 
     xySeriesCollection.addSeries(series); 
     return xySeriesCollection; 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       ScatterMouseClick demo = new ScatterMouseClick("Scatter Mouse click Demo"); 
       demo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       demo.pack(); 
       demo.setLocationRelativeTo(null); 
       demo.setVisible(true); 
      } 
     }); 
    } 
} 

this is another post on how to display point information

+0

+1 [sscce](http://sscce.org/)。 – trashgod

回答

1

使用一个ChartMouseListener,如图here。您可以根据需要检查ChartEntity。如果您在ChartFactory中启用了URL生成,则可能会方便使用getURLText()

附录:与您的例子生成的URL最简单的修改是通过设置最后一个参数,urls,让他们在ChartFactory,以true

JFreeChart jfreechart = ChartFactory.createScatterPlot(
    "Scatter Mouse click Demo", "X", "Y", createSampleData(), 
    PlotOrientation.VERTICAL, true, true, true); 

你可以看到工厂如何增加发电机渲染器here。您可以指定备用constructor parameters,或者可以覆盖generateURL()方法来自定义结果。

控制台:

 
You clicked at point of series:[0] at location: [0] 
    with URL Text: index.html?series=0&item=0 
You clicked at point of series:[0] at location: [1] 
    with URL Text: index.html?series=0&item=1 
You clicked at point of series:[0] at location: [2] 
    with URL Text: index.html?series=0&item=2 

附录:基于一个现在删除评论,请注意getURLText()仅检索什么发电机放那里。或者,请注意,XYItemEntity提供了对父节点XYDataset的完全访问权限,但您可能必须将其转换为您的子类才能检索特定数据。

+0

我有代码来获取ChartEntity,但你如何提取GUID形式呢? – user648026

+0

'ChartEntity'可以访问实体的URL文本,您的'XYURLGenerator'离开它。 – trashgod

+0

我看到这个演示做类似http://ww.nothingbutclouds.com/websvn/filedetails.php?repname=repo&path=/JFreeChartDemo/src/demo/ScatterPlotDemo3.java&peg=211但我仍然无法弄清楚如何提取工具提示或URL文本...如果你可以帮助一段代码 - 这将是伟大的 – user648026