我用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);
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);
解决方案 »
- 一道面试题,求更好的答案
- 100分求解Interface类型引用的问题
- SWT 打包用什么打包工具可以不用jre。介绍一下谢谢
- 关于getDelaredMethod()方法的问题;答完结贴;谢谢了;
- 问一个名词解释
- java中如何给空格的值强制赋值
- 问问 !及此事可不可以用java二次开发AutoCAD
- Image,ImageIcon,Icon的不同处和各在什么情况下用
- 问一个字符编码解码的问题!在线等待。
- Vector问题
- 构造方法里异常处理
- JAVA GUI基础题目:怎么样才能是点击【帮助】里的【退出帮助】在弹出的窗口时,为要关闭这一个窗口,而不关闭菜单窗口和登陆界面的窗口?该怎么办啊 其他的不好的地方望帮我改正啊
timeSeries=(TimeSeries)collection.getSeries(dnameString).clone();//获取一个timeseries
//timeSeries=collection.getSeries(dnameString);
timeSeries.add(new Millisecond(date),oltBerRate);//对该timeseries增加值点
但我不知道他到底怎么错了.
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);
}
});
}
}
不知道是不是这个原因。
lz在方法后加一句collection.addSeries(timeSeries);试试看。
或者把timeSeries=(TimeSeries)collection.getSeries(dnameString).clone();
这句的clone去掉。
clone()是在后来改成那样的,以前没用clone().但你说的这个addseries().应该是在建立chart的时候就用了的.
而且我加了以后还是只有一条曲线.
说明下:我这个段代码在timer外面运行是完全正确的.但一放在timer里就只有一条曲线了.
现在还有个问题就是:刷新问题.这个chart不自己刷新,除非我动一下shell或者点下鼠标什么的.我想是不是swt和jfreechart的机制有点不兼容呢
chartcomposite来调用chart.现在改成用swt_awt.new_frame()方法来实现,就可以用了.因为jfreechart是用java2d来实现的.而swt是用graphics2d实现的.所以不兼容.