我现在需要做一个小软件
需要从串口获得下位数据并以类似任务管理器里cpu使用记录的那种图形显示
其他的都做好了
就是这个显示很折磨人啊
怎么做到更新显示呢。我现在是用 vector 装10个数然后一次把它们遍历出来2个2个连
可是很麻烦啊
有人做过类似的东西么。。指教一下。。

解决方案 »

  1.   

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.util.LinkedList;import javax.swing.JFrame;public class WaveFrame extends JFrame { public WaveFrame() {
    WaveCanvas wave = new WaveCanvas();
    this.add(wave);
    Thread th = new Thread(wave);
    th.start();
    } public static void main(String[] a){
    JFrame jf = new  WaveFrame();
    jf.setSize(400, 300);
    jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jf.setVisible(true);
    }

    /**
     * 画图区
     * @author
     *
     */
    class WaveCanvas extends Canvas implements Runnable {
    Queue data = new Queue(20);//队列中要显示的值
    Graphics g; int[] x = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 
    110, 120, 130, 140, 150, 160, 170, 180, 190, 200 };//x轴,固定
    int[] y = new int[] { 200, 200, 200, 200, 200, 200, 200, 200, 200, 200,
    200, 200, 200, 200, 200, 200, 200, 200, 200, 200 };//y轴从队列中取.初始全为200,或者其它任何数字.

    int drawpts =0;//画的点数.20个之前累加,20个之后就只画20个.

    public WaveCanvas() {
    setSize(400, 200);
    }
    @Override
    public void paint(Graphics g) {
    super.paint(g);
    this.g = g;
    drawWave();
    } public void run() {
    while(true){
    int d = (int)(Math.random()*1000)%200;
    data.put(d);
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    drawpts++;
    if(drawpts>20) drawpts=20;
    repaint();
    }
    }

    private void drawWave(){
    System.out.println("==============================");
    for(int i = 0; i < data.size(); i++){
    y[i] = 200-(Integer)data.get(i);
    System.out.println(y[i]);
    }
    g.setColor(Color.GREEN);
    g.drawPolyline(x,y,drawpts);
    } }
    /**
     * 队列,先进先出.
     * @author 
     *
     */
    class Queue {
    private LinkedList<Object> list = new LinkedList<Object>();
    private int size;
    public Queue(int size){
    this.size = size;
    }
    public synchronized void put(Object v) {
    if(isFull())
    list.removeFirst();
    list.addLast(v);
    } public synchronized Object out() {
    return list.removeFirst();
    } public boolean isEmpty() {
    return list.isEmpty();
    }

    public boolean isFull(){
    return (list.size()==size);
    }

    public int size(){
    return list.size();
    }

    public Object get(int i){
    if(i < list.size())
    return list.get(i);
    else
    return 0;
    }
    }  
    }
      

  2.   

    其实绘图没有这么的麻烦,用jfreechar封装为自己的工具类,就可以,如package com.san.report;import java.awt.Color;
    import java.awt.Font;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartRenderingInfo;
    import org.jfree.chart.ChartUtilities;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.CategoryLabelPositions;
    import org.jfree.chart.axis.NumberAxis;
    import org.jfree.chart.entity.StandardEntityCollection;
    import org.jfree.chart.labels.PieSectionLabelGenerator;
    import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.category.BarRenderer;
    import org.jfree.chart.renderer.category.LineAndShapeRenderer;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.category.DefaultCategoryDataset;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.ui.HorizontalAlignment;
    import org.jfree.ui.RectangleEdge;public class PlantInit {
    /*********
     * 
     * @author wuwh
     * vlineName代表横坐标标志;
     * hlineName代表纵坐标标志名称;
     * 
     * 曲线图的绘制;
     * **********/
    public static String excelName;public static String  plantCurvesLine(List list,String topName,String vlineName,String hlineName,HttpServletRequest request){

    DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();

     FileOutputStream fos_jpg = null;
    //设置值;
    int cont=list.size();
    for(int i=0;i<cont;i++){
    PlantTo to=(PlantTo) list.get(i);
    defaultcategorydataset.addValue(to.getMapValue(), to.getMapname(), to.getMapkey());
    }
    //绘图到内存 
    JFreeChart jfreechart1 = ChartFactory.createLineChart(
    topName, vlineName, hlineName,
    defaultcategorydataset, PlotOrientation.VERTICAL, true, true,
    true);
    //头信息的设置;
    TextTitle texttitle = new TextTitle(topName);
    texttitle.setFont(new Font("SansSerif", 0, 10));
    texttitle.setPosition(RectangleEdge.BOTTOM);
    texttitle.setHorizontalAlignment(HorizontalAlignment.RIGHT);
    jfreechart1.addSubtitle(texttitle);
    jfreechart1.setBackgroundPaint(Color.decode("#FFCC00"));
    CategoryPlot categoryplot = (CategoryPlot) jfreechart1.getPlot();
    //设置纵横条的颜色;
    categoryplot.setBackgroundPaint(Color.decode("#996600"));
    categoryplot.setRangeGridlinePaint(Color.white);
    categoryplot.setDomainGridlinePaint(Color.white);
    categoryplot.setDomainGridlinesVisible(true);//显示纵线
    CategoryAxis categoryaxis = categoryplot.getDomainAxis();
        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);
    // categoryplot.set
    NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits()); LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
    .getRenderer();
      
    lineandshaperenderer.setShapesVisible(true);
    lineandshaperenderer.setDrawOutlines(true);
    lineandshaperenderer.setUseFillPaint(true);
    //设置两条曲线的不同颜色;
    //jfreechart1.getSubtitleCount()----表示有多少条曲线;
    lineandshaperenderer.setSeriesPaint(0, Color.RED);
    lineandshaperenderer.setSeriesPaint(1, Color.BLUE);
    lineandshaperenderer.setSeriesFillPaint(0, Color.RED);
    lineandshaperenderer.setSeriesFillPaint(1, Color.BLUE);

    if(null!=request.getAttribute("incont") && ""!=request.getAttribute("incont")){
    lineandshaperenderer.setSeriesFillPaint(2, Color.YELLOW);
    lineandshaperenderer.setSeriesFillPaint(2, Color.YELLOW);
    } lineandshaperenderer.setBaseLinesVisible(true);


    String imageFile_qx=null;
    try {
    //向内存中绘制出真实的曲线图并且保存在session当中;
    imageFile_qx = ServletUtilities.saveChartAsJPEG(jfreechart1,600,450,request.getSession());//设置生成图片,包括图片的大小,长度是500,宽是400        
    } catch (IOException e) {
    e.printStackTrace();



    String fullpath = InitServlet.sysPath+"JfreeImg\\"+imageFile_qx;

    try {
    fos_jpg = new FileOutputStream(fullpath);
    ChartUtilities.writeChartAsJPEG(fos_jpg,1.0f,jfreechart1,600,450,null);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return imageFile_qx;//图片路径;
      }
       
      

  3.   

    /******************
        * 
        * 
        * @author wuwh
        * 2D饼图的显示;
        * 
        * 
        * ***********************/   public static String plant2DLine(List list,HttpServletRequest request,String topname){    HttpSession session=request.getSession();
       
       DefaultPieDataset dfp=new DefaultPieDataset();//数据池;
       FileOutputStream fos_jpg = null;
           //向数据池中设置一堆数据,将其填充;
       int cont=list.size();
       for(int i=0;i<cont;i++){
    PlantTo to=(PlantTo) list.get(i);
    dfp.setValue(to.getMapkey(), to.getMapValue());
       }
           
           JFreeChart a =ChartFactory.createPieChart(topname,dfp, false, true, true);
          //设置图形上面的字体,颜色,变化
           PiePlot  pie=(PiePlot )a.getPlot();
           pie.setLabelFont(new Font("SansSerif",Font.BOLD,12));
           pie.setNoDataMessage("No data available");
           pie.setCircular(true);
           pie.setLabelGap(0.01D);//间距
           
           pie.setLabelGenerator(new StandardPieSectionLabelGenerator("{0} ({2})"));//设置现实的文字样式;       //将缓存中的jfreechart对象用frame的实例显示给用户;
           //PrintWriter out = response.getWriter();
           ChartRenderingInfo info=new ChartRenderingInfo(new StandardEntityCollection());
           String imgaeFileName_2d=null;
            try {
    imgaeFileName_2d = ServletUtilities.saveChartAsJPEG(a,350,300,info,session);//设置生成图片,包括图片的大小,长度是500,宽是400
    //session=null;
    } catch (IOException e) {
    e.printStackTrace();


    String fullpath = InitServlet.sysPath+"JfreeImg\\"+imgaeFileName_2d;

    try {
    fos_jpg = new FileOutputStream(fullpath);
    ChartUtilities.writeChartAsJPEG(fos_jpg,1.0f,a,350,300,null);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }


    request.setAttribute("image_name_2d", imgaeFileName_2d);//保存图片的名称;
    return imgaeFileName_2d;
      // return fullpath; 
       }
       
       /******************
        * 
        * 
        * @author wuwh
        * 柱状图的显示;
        * vlineName代表横坐标标志;
    * hlineName代表纵坐标标志名称;

        * ***********************/
       
       public static String planeReacgLine(List list,String topName,String vlineName,String hlineName,HttpServletRequest request){

       /*********柱状图的生成**********/
       int cont=list.size();
       DefaultCategoryDataset dataset = new DefaultCategoryDataset();
       for(int i=0;i<cont;i++){
       PlantTo to=(PlantTo) list.get(i);
       dataset.addValue(to.getMapValue(),i+"",to.getMapkey());//待补充。。
       }
           JFreeChart chart=ChartFactory.createBarChart3D(topName, hlineName,vlineName, dataset, PlotOrientation.HORIZONTAL, false, true, false);
           CategoryPlot plot = chart.getCategoryPlot();
       final BarRenderer renderer1 = (BarRenderer) plot.getRenderer();
       renderer1.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());
       renderer1.setItemMargin(0.01D);// 设置每个柱子之间的距离
       plot.setRenderer(renderer1);
       
       String imgaeFileName_RE=null;
    try {
    imgaeFileName_RE = ServletUtilities.saveChartAsJPEG(chart,600,400,request.getSession());//设置生成图片,包括图片的大小,长度是500,宽是400        
    } catch (IOException e) {
    e.printStackTrace();

    request.setAttribute("image_name_RE", imgaeFileName_RE);//保存图片的名称;
            return imgaeFileName_RE;
       }
       
       
       
       public static String  plantCurvesLineAfter(List list,String topName,String vlineName,String hlineName,String contName,String imgName){

    DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset();

     FileOutputStream fos_jpg = null;
    //设置值;
    int cont=list.size();
    for(int i=0;i<cont;i++){
    PlantTo to=(PlantTo) list.get(i);
    defaultcategorydataset.addValue(to.getMapValue(), to.getMapname(), to.getMapkey());
    }
    //绘图到内存 
    JFreeChart jfreechart1 = ChartFactory.createLineChart(
    topName, vlineName, hlineName,
    defaultcategorydataset, PlotOrientation.VERTICAL, true, true,
    true);
    //头信息的设置;
    TextTitle texttitle = new TextTitle(topName);
    texttitle.setFont(new Font("SansSerif", 0, 10));
    texttitle.setPosition(RectangleEdge.BOTTOM);
    texttitle.setHorizontalAlignment(HorizontalAlignment.RIGHT);
    jfreechart1.addSubtitle(texttitle);
    jfreechart1.setBackgroundPaint(Color.decode("#FFCC00"));
    CategoryPlot categoryplot = (CategoryPlot) jfreechart1.getPlot();
    //设置纵横条的颜色;
    categoryplot.setBackgroundPaint(Color.decode("#996600"));
    categoryplot.setRangeGridlinePaint(Color.white);
    categoryplot.setDomainGridlinePaint(Color.white);
    categoryplot.setDomainGridlinesVisible(true);//显示纵线
    NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis();
    numberaxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    CategoryAxis categoryaxis = categoryplot.getDomainAxis();
        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);//文字倾斜45度
        
    LineAndShapeRenderer lineandshaperenderer = (LineAndShapeRenderer) categoryplot
    .getRenderer();
      
    lineandshaperenderer.setShapesVisible(true);
    lineandshaperenderer.setDrawOutlines(true);
    lineandshaperenderer.setUseFillPaint(true);
    //设置两条曲线的不同颜色;
    //jfreechart1.getSubtitleCount()----表示有多少条曲线;
    lineandshaperenderer.setSeriesPaint(0, Color.RED);
    lineandshaperenderer.setSeriesPaint(1, Color.BLUE);
    lineandshaperenderer.setSeriesFillPaint(0, Color.RED);
    lineandshaperenderer.setSeriesFillPaint(1, Color.BLUE);

    if(null !=contName && !"".equals(contName)){
    lineandshaperenderer.setSeriesPaint(2, Color.yellow);
    lineandshaperenderer.setSeriesFillPaint(2, Color.yellow);
    } String imageFile_qx=null;
    lineandshaperenderer.setBaseLinesVisible(true);
    Calendar  calendar=Calendar.getInstance();
    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm");
    try {
    Date date=df.parse(calendar.getTime().toLocaleString());
    imageFile_qx=imgName+date.toLocaleString().split(" ")[0]+" "+date.toLocaleString().split(" ")[1].split(":")[0]+"时"+date.toLocaleString().split(" ")[1].split(":")[1]+"分"+".jpeg";
    excelName=imageFile_qx.split(".jpeg")[0];
    } catch (Exception e1) {
    e1.printStackTrace();
    }


    // try {
    // //向内存中绘制出真实的曲线图并且保存在session当中;
    // imageFile_qx = ServletUtilities.saveChartAsJPEG(jfreechart1,600,450,request.getSession());//设置生成图片,包括图片的大小,长度是500,宽是400        
    // } catch (IOException e) {
    // e.printStackTrace();
    // } 
    String fullpath = InitServlet.sysPath+"JfreeImg\\"+imageFile_qx;

    try {
    fos_jpg = new FileOutputStream(fullpath);
    ChartUtilities.writeChartAsJPEG(fos_jpg,1.0f,jfreechart1,600,450,null);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return fullpath;//图片路径;
      }
       public static String  plantTimerSerLine(List list,String topName,String vlineName,String hlineName,HttpServletRequest request){
       
        
       return null;
       }}