import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.*;import org.jfree.chart.*;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.*;
import org.jfree.data.time.ohlc.OHLCSeries;
import org.jfree.data.time.ohlc.OHLCSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.*;public class TimeSeriesDemo1 extends ApplicationFrame implements ChartMouseListener {    public JFreeChart chart;
    ChartPanel chartPanel;
    private boolean crossedAxis = false;
    private double xValue = 0.0;
    private double yValue = 0.0;
    private int mouseX = 0;
    private int mouseY = 0;
    private Point2D point;
    private Rectangle2D rectangle2D;
    private SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
    public static  XYPlot xyplot;
    public Frame frame;
    public TimeSeriesDemo1(String s)
    {
        super(s);
        XYDataset xydataset = createDataset();
        JFreeChart jfreechart = createChart(xydataset);
        chartPanel = new ChartPanel(jfreechart, false);
        chartPanel.addChartMouseListener(this);
        chartPanel.setPreferredSize(new Dimension(500, 270));
        chartPanel.setMouseZoomable(true, false);
                chartPanel.setVerticalAxisTrace(true);
        chartPanel.setHorizontalAxisTrace(true);
        setContentPane(chartPanel);
    }    private static JFreeChart createChart(XYDataset xydataset)
    {
        JFreeChart jfreechart = ChartFactory.createTimeSeriesChart("Legal & General Unit Trust Prices", "Date", "Price Per Unit", xydataset, true, true, true);
        jfreechart.setBackgroundPaint(Color.white);
        xyplot = (XYPlot)jfreechart.getPlot();
        xyplot.setBackgroundPaint(Color.lightGray);
        xyplot.setDomainGridlinePaint(Color.white);
        xyplot.setRangeGridlinePaint(Color.white);
        xyplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));
        xyplot.setDomainCrosshairVisible(true);
        xyplot.setRangeCrosshairVisible(true);
        org.jfree.chart.renderer.xy.XYItemRenderer xyitemrenderer = xyplot.getRenderer();
        if(xyitemrenderer instanceof XYLineAndShapeRenderer)
        {
            XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)xyitemrenderer;
            xylineandshaperenderer.setBaseShapesVisible(true);
            xylineandshaperenderer.setBaseShapesFilled(true);
        }
        DateAxis dateaxis = (DateAxis)xyplot.getDomainAxis();
        dateaxis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
        return jfreechart;
    }    private static XYDataset createDataset()
    {
        TimeSeries timeseries = new TimeSeries("L&G European Index Trust", org.jfree.data.time.Month.class);
        timeseries.add(new Month(2, 2001), 181.80000000000001D);
        timeseries.add(new Month(3, 2001), 167.30000000000001D);
        timeseries.add(new Month(4, 2001), 153.80000000000001D);
        timeseries.add(new Month(5, 2001), 167.59999999999999D);
        timeseries.add(new Month(6, 2001), 158.80000000000001D);
        timeseries.add(new Month(7, 2001), 148.30000000000001D);
        timeseries.add(new Month(8, 2001), 153.90000000000001D);
        timeseries.add(new Month(9, 2001), 142.69999999999999D);
        timeseries.add(new Month(10, 2001), 123.2D);
        timeseries.add(new Month(11, 2001), 131.80000000000001D);
        timeseries.add(new Month(12, 2001), 139.59999999999999D);
        timeseries.add(new Month(1, 2002), 142.90000000000001D);
        timeseries.add(new Month(2, 2002), 138.69999999999999D);
        timeseries.add(new Month(3, 2002), 137.30000000000001D);
        timeseries.add(new Month(4, 2002), 143.90000000000001D);
        timeseries.add(new Month(5, 2002), 139.80000000000001D);
        timeseries.add(new Month(6, 2002), 137D);
        timeseries.add(new Month(7, 2002), 132.80000000000001D);
        TimeSeries timeseries1 = new TimeSeries("L&G UK Index Trust", org.jfree.data.time.Month.class);
        timeseries1.add(new Month(2, 2001), 129.59999999999999D);
        timeseries1.add(new Month(3, 2001), 123.2D);
        timeseries1.add(new Month(4, 2001), 117.2D);
        timeseries1.add(new Month(5, 2001), 124.09999999999999D);
        timeseries1.add(new Month(6, 2001), 122.59999999999999D);
        timeseries1.add(new Month(7, 2001), 119.2D);
        timeseries1.add(new Month(8, 2001), 116.5D);
        timeseries1.add(new Month(9, 2001), 112.7D);
        timeseries1.add(new Month(10, 2001), 101.5D);
        timeseries1.add(new Month(11, 2001), 106.09999999999999D);
        timeseries1.add(new Month(12, 2001), 110.3D);
        timeseries1.add(new Month(1, 2002), 111.7D);
        timeseries1.add(new Month(2, 2002), 111D);
        timeseries1.add(new Month(3, 2002), 109.59999999999999D);
        timeseries1.add(new Month(4, 2002), 113.2D);
        timeseries1.add(new Month(5, 2002), 111.59999999999999D);
        timeseries1.add(new Month(6, 2002), 108.8D);
        timeseries1.add(new Month(7, 2002), 101.59999999999999D);
        TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
        timeseriescollection.addSeries(timeseries);
        timeseriescollection.addSeries(timeseries1);
        return timeseriescollection;
    }    public static void main(String args[])
    {
        TimeSeriesDemo1 timeseriesdemo1 = new TimeSeriesDemo1("Time Series Demo 1");
        timeseriesdemo1.pack();
        RefineryUtilities.centerFrameOnScreen(timeseriesdemo1);
        timeseriesdemo1.setVisible(true);
    }   public void chartMouseClicked(ChartMouseEvent chartMouseEvent) {
        if (chartMouseEvent.getTrigger().getClickCount() == 2) {
            crossedAxis = !crossedAxis;
        }
   }    public void chartMouseMoved(ChartMouseEvent chartMouseEvent) {
        point = chartMouseEvent.getTrigger().getPoint();
        mouseX = chartMouseEvent.getTrigger().getX();
        mouseY = chartMouseEvent.getTrigger().getY();
        Point2D point2D = this.chartPanel.translateScreenToJava2D(new Point(mouseX, mouseY));
        ChartRenderingInfo info = this.chartPanel.getChartRenderingInfo();
        rectangle2D = chartPanel.getScreenDataArea();
        yValue = xyplot.getRangeAxis().java2DToValue(point2D.getY(), info.getPlotInfo().getDataArea(), RectangleEdge.RIGHT);
        xValue = xyplot.getDomainAxis().java2DToValue(point2D.getX(), info.getPlotInfo().getDataArea(), RectangleEdge.BOTTOM);
        refreshAxis(mouseY, mouseX);
    }
     public void refreshAxis(int mouseY, int mouseX) {
        Graphics g = this.getGraphics();
        update(g);
        int recW = (int) (rectangle2D.getX() + rectangle2D.getWidth());
        int recX = (int) rectangle2D.getX();
        int recY = (int) rectangle2D.getY();
        int recH = (int) (rectangle2D.getY() + rectangle2D.getHeight());
        if (mouseX < recW && mouseX > recX && mouseY < recH && mouseY > recY) {
            g.drawLine(recX, mouseY, recW, mouseY);
            g.drawLine(mouseX, recY, mouseX, recH);
        }
    }    @Override
    public void update(Graphics g) {
        if (g.getClip() == null) {
            paint(g);
            int recX = (int) rectangle2D.getX();
            int recY = (int) rectangle2D.getY();
            int recH = (int) (rectangle2D.getY() + rectangle2D.getHeight());
            int recW = (int) (rectangle2D.getX() + rectangle2D.getWidth());
            if (mouseX < recW && mouseX > recX && mouseY < recH && mouseY > recY) {
            g.drawString(String.valueOf((int)(yValue)), mouseX + 20, mouseY + 1);
            g.drawString(dateFormat1.format(new Date((long) xValue)), mouseX + 20,mouseY + 12);
           }
        }
    }
}

解决方案 »

  1.   

    你移动鼠标,就会产生鼠标事件,就会重画画面。不做特殊处理,画面就会闪烁。这个是老问题了。在网上查找怎么防止闪烁就行。不过你的程序可能要大改。因为防闪烁的原理就是先将所有要画的东西画到一个临时的缓存里,然后将所有的数据一起重画。一般都是自己写paint方法。在方法头加点代码,在方法尾加点代码。中间是你的所有的画东西的方法。这样来解决闪烁问题。你的画东西的方法怎么哪都有阿。不是好习惯。
      

  2.   

    JFreeChart貌似都这么写的,我加了一个鼠标监听在Update()时有点问题
      

  3.   

    有没有JFreeChart的高手帮帮忙啊!!!!!
    问题比较急啊,先谢谢了