我用jfreechart做实时多曲线图.用timer开循环曲线.现在的问题是画曲线的代码放在timer外面就可以画出多个曲线.一旦放进timer里就画不出来了.请高手帮忙!急.代码如下:
long cycle=0;//定时时间
 try {
sqlConnect=new SqlConnect();
sqlConnect.getServer(mainFrame.strServer, mainFrame.strSeruser, mainFrame.strSerpwd);
cycle=sqlConnect.getDataLoopCycle();
} catch (Exception e) {
// TODO: handle exception
}
final TimerTask tt = new TimerTask(){
    public void run(){
     if (stop==false) {
         try {
         SimpleDateFormat bartDateFormat = new SimpleDateFormat("yy-MM-dd HH:mm");
         sqlConnect=new SqlConnect();
         sqlConnect.getServer(mainFrame.strServer, mainFrame.strSeruser, mainFrame.strSerpwd);
         String sql="select * from tbOLTRegInfo where status=1 and show=1";
         sqlConnect.SelectOLT(sql);
         while(sqlConnect.oltresult.next())
         {
         String agentMAC=sqlConnect.oltresult.getString("agentMAC").trim();
         oltid=sqlConnect.oltresult.getInt("LLID");
         String dnameString="OLT:"+sqlConnect.oltresult.getInt("driverName");
         Date date=new Date();
         String sql1="select * from tbOLTMetrical where agentMAC='"+agentMAC.trim()+"' and LLID="+oltid+" and setDatatime=(select max(setDatatime)" +
         " from tbOLTMetrical where setDatatime<='"+bartDateFormat.format(date)+"' and agentMAC='"+agentMAC.trim()+"' and LLID="+oltid+")";
         sqlConnect.SelectSql(sql1);
         while(sqlConnect.result.next())
         {
         int oltBerRate=sqlConnect.result.getInt("oltBerRate");
         timeSeries=(TimeSeries)collection.getSeries(dnameString).clone();//获取一个timeseries
         //timeSeries=collection.getSeries(dnameString);
         timeSeries.add(new Millisecond(date),oltBerRate);//对该timeseries增加值点
         System.out.println(oltid+":"+dnameString+"--"+oltBerRate);
        
         }
         sqlConnect.connection.close();
         agentMAC=null;
         dnameString=null;
         date=null;
         sql1=null;
         }
         sqlConnect.connection.close();
         sql=null;
         } catch (Exception e) {
         System.out.println(e);
         }
}
         else {
boolean isStop=cancel();
}
    }
  };
//定事更新
final Timer timer=new Timer();
final long timestart=0;
final long timestamp =cycle; 
timer.schedule(tt,timestart,timestamp);

解决方案 »

  1.   

    问题主要是出在
    timeSeries=(TimeSeries)collection.getSeries(dnameString).clone();//获取一个timeseries 
            //timeSeries=collection.getSeries(dnameString); 
            timeSeries.add(new Millisecond(date),oltBerRate);//对该timeseries增加值点 
    但我不知道他到底怎么错了.
      

  2.   

    顶,我这儿有段代码可能会帮上你import java.util.Date;import org.jfree.chart.ChartFactory;   
    import org.jfree.chart.ChartPanel;   
    import org.jfree.chart.JFreeChart;   
    import org.jfree.chart.axis.ValueAxis;   
    import org.jfree.chart.plot.XYPlot;   
    import org.jfree.data.gantt.Task;
    import org.jfree.data.gantt.TaskSeries;
    import org.jfree.data.gantt.TaskSeriesCollection;
    import org.jfree.data.time.Millisecond;   
    import org.jfree.data.time.TimePeriod;
    import org.jfree.data.time.TimeSeries;   
    import org.jfree.data.time.TimeSeriesCollection;   
    public class LineShow extends ChartPanel implements Runnable   {
      private static TimeSeries timeSeries,timeSeries2;   
        private long value=0;   
           
        public LineShow(String chartContent,String title,String yaxisName)   
        {   
            super(createChart(chartContent,title,yaxisName));   
        }   
        private static JFreeChart createChart(String chartContent,String title,String yaxisName){   
            //创建时序图对象   
            timeSeries = new TimeSeries(chartContent,Millisecond.class);   
            timeSeries2 = new TimeSeries("2222",Millisecond.class);
            
            TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(timeSeries);   
            timeseriescollection.addSeries(timeSeries2);
            JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(title,"时间(秒)",yaxisName,timeseriescollection,true,true,false);   
            XYPlot xyplot = jfreechart.getXYPlot();   
            //纵坐标设定   
            ValueAxis valueaxis = xyplot.getDomainAxis();   
            //自动设置数据轴数据范围   
            valueaxis.setAutoRange(true);   
            //数据轴固定数据范围 30s   
            valueaxis.setFixedAutoRange(30000D);   
       
            valueaxis = xyplot.getRangeAxis();   
            //valueaxis.setRange(0.0D,200D);   
       
            return jfreechart;   
          }
       
        public void run()   
        {   
            while(true)   
            {   
            try   
            {   
                timeSeries.add(new Millisecond(), randomNum());   
                timeSeries2.add(new Millisecond(), randomNum());
                Thread.sleep(300);   
            }   
            catch (InterruptedException e)  {   }   
            }          
        }   
           
        private long randomNum()   
        {      
            System.out.println((Math.random()*20+80));         
            return (long)(Math.random()*20+80);   
        } 
    }/***Test**/
    import java.awt.BorderLayout;   
    import java.awt.event.WindowAdapter;   
    import java.awt.event.WindowEvent;   
    import javax.swing.JFrame;   
       
    public class Test   
    {   
       
        /**  
         * @param args  
         */   
        public static void main(String[] args)   
        {   
        JFrame frame=new JFrame("Test Chart");   
        LineShow rtcp=new LineShow("Random Data","随机数","数值");   
        //GantShow rtc = new GantShow();
        frame.getContentPane().add(rtcp,new BorderLayout().CENTER);   
        frame.pack();   
        frame.setVisible(true);   
       (new Thread(rtcp)).start();   
        frame.addWindowListener(new WindowAdapter()    
        {   
            public void windowClosing(WindowEvent windowevent)   
            {   
                System.exit(0);   
            }   
       
        });   
        }   

      

  3.   

    kerry_lulu  类似的代码我看过了.但问题是按上述方法移植到我的代码里还是相同的问题.其中这2段代码中只有一个地方有区别就是我是动态创建曲线.而你的代码是静态确定2条曲线.所以我怀疑的地方是动态创建曲线是否在线程里的调用有什么问题.
      

  4.   

    获得的timeSeries是原collection的一个克隆版,修改后没有add到原collection中。
    不知道是不是这个原因。
    lz在方法后加一句collection.addSeries(timeSeries);试试看。
    或者把timeSeries=(TimeSeries)collection.getSeries(dnameString).clone();
    这句的clone去掉。
      

  5.   

    hongke1490 
    clone()是在后来改成那样的,以前没用clone().但你说的这个addseries().应该是在建立chart的时候就用了的.
    而且我加了以后还是只有一条曲线.
    说明下:我这个段代码在timer外面运行是完全正确的.但一放在timer里就只有一条曲线了.
    现在还有个问题就是:刷新问题.这个chart不自己刷新,除非我动一下shell或者点下鼠标什么的.我想是不是swt和jfreechart的机制有点不兼容呢
      

  6.   

    问题解决了.这个段代码完全没问题.当然clone()是不用的.问题出在swt调用chart的地方.我以前用的是
    chartcomposite来调用chart.现在改成用swt_awt.new_frame()方法来实现,就可以用了.因为jfreechart是用java2d来实现的.而swt是用graphics2d实现的.所以不兼容.