首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

使用JFreeChart制作图表,但是鼠标移动屏幕就闪一下,public void update(Graphics g){paint(g)}不能消除

2012-03-14 
使用JFreeChart制作图表,但是鼠标移动屏幕就闪一下,public void update(Graphicsg){paint(g)}不能消除求高

使用JFreeChart制作图表,但是鼠标移动屏幕就闪一下,public void update(Graphics g){paint(g)}不能消除求高手指教
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);
  }
  }
  }
}



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

热点排行