CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  GUI 设计

急问:Graphics2D画曲线时的截断问题

楼主strangerryf(白痴与白痴讨论的结果一定是比白痴更为白痴的结论)2006-05-03 21:29:40 在 Java / GUI 设计 提问

我原来的代码是C#的,后来为了移植到Linux,发现必须改用Java。  
  C#中的Graphics提供了float参数的DrawLine方法,而Java的Graphics2D中没有对应的方法,因此我画出来的曲线出现了截断的状况。  
  C#的代码片断如下:  
  private   void   DrawSig(ArrayList   data,   float   pos,   Color   c)  
  {  
  //   draw   signal  
  int   i;  
  float   vt   =   -100.0f,   hr   =   (float)(ClientSize.Width)   /   (len*1.1f),   tmp0,   tmp1;  
  //   vt   -   vertical   scale   ratio  
  //   hr   -   horizontal   scale   ratio  
  //   tmp0   -   previous   data  
  //   tmp1   -   current   data  
  g.TranslateTransform(20,   pos);  
  g.ScaleTransform(hr,   vt);  
  Pen   pn   =   new   Pen(c);  
  tmp0   =   (float)(Convert.ToDouble(data[0]));  
  g.DrawLine(pn,   0,   tmp0,   0,   tmp0);  
  for   (i   =   1;   i   <   org.Count;   i++)  
  {  
  tmp0   =   (float)(Convert.ToDouble(data[i   -   1]));  
  tmp1   =   (float)(Convert.ToDouble(data[i]));  
  g.DrawLine(pn,   i   -   1,   tmp0,   i,   tmp1);  
  }  
  g.ScaleTransform(1   /   hr,   1/vt);  
  g.TranslateTransform(-20,   -pos);  
  }  
  改成Java后如下:  
          private   void   DrawSig(Graphics2D   g,   ArrayList<Float>   data,   float   pos,   Color   c)  
          {  
                  //   draw   signal  
                  int   i;  
                  float   vt   =   -100.0f,   hr   =   (float)(getWidth())   /   (len*1.1f),   tmp0,   tmp1;  
                  //   vt   -   vertical   scale   ratio  
                  //   hr   -   horizontal   scale   ratio  
                  //   tmp0   -   previous   data  
                  //   tmp1   -   current   data  
   
                  g.translate(20,   pos);  
                  g.scale(hr,   vt);  
                  g.setPaint(c);  
                  tmp0   =   data.get(0)*getHeight()/100.0f;  
                  g.drawLine(0,   (int)tmp0,   0,   (int)tmp0);  
                  for   (i   =   1;   i   <   ogn.size();   i++)  
                  {  
                          tmp0   =   data.get(i   -   1)*getHeight()/100.0f;  
                          tmp1   =   data.get(i)*getHeight()/100.0f;  
                          g.drawLine(i   -   1,   (int)tmp0,   i,   (int)tmp1);  
                  }  
                  g.scale(1/hr,   1/vt);  
                  g.translate(-20,   -pos);  
          }  
   
  Java的版本是直接在JFrame里边的paint方法画的。好像没找到类似C#的  
                  CreateGraphics().DrawImage(bmp,   ClientRectangle);  
  这种双缓冲画法,由于数据较多故每次有遮盖都要重画很久。  
   
  我是Java新手,请大虾们多多指教! 问题点数:100、回复次数:4Top

1 楼gtlang78()回复于 2006-05-04 00:54:18 得分 100

import   java.awt.geom.*;  
  ...  
   
   
  Line2D   line   =   new   Line2D.Float(x1,   y1,   x2,   y2);    
  graphics2d.draw(line);  
  Top

2 楼strangerryf(白痴与白痴讨论的结果一定是比白痴更为白痴的结论)回复于 2006-05-04 08:49:59 得分 0

谢谢gtlang78的指点,好像可以画出部分效果了。刚刚发现截断的现象是由于垂直放大了100倍引起的,所以只需要在构造line的时候对y1,y2乘100就可以了。而且Java画线的速度明显快于C#,估计是没有用C#的泛型ArrayList,而且读文件操作没有用到bufferedstream。  
   
  剩下的问题是,如何避免图像被遮盖时的重画过程?Top

3 楼strangerryf(白痴与白痴讨论的结果一定是比白痴更为白痴的结论)回复于 2006-05-04 09:55:25 得分 0

晕...  
  使用Windows中的NetBeans生成的jar包,发现在Linux中开始时无法绘制。只有发生遮盖等事件引发重画才有显示  
  Top

4 楼strangerryf(白痴与白痴讨论的结果一定是比白痴更为白痴的结论)回复于 2006-05-04 12:04:28 得分 0

呼.................  
  求人不如求己  
  google了一下,搞定了:  
   
  import   java.awt.image.*;  
  ........  
  先声明  
          BufferedImage   bi;   //   for   buffered   display  
          Graphics2D   big;   //   for   buffered   display  
  然后在构造方法里边初始化:  
          bi=(BufferedImage)createImage(getWidth(),   getHeight());  
          big=bi.createGraphics();  
  并在big上画图。然后在paint方法里贴图:  
          public   void   paint(Graphics   g)  
          {  
                  Graphics2D   g2   =   (Graphics2D)g;                  
                  g2.drawImage(bi,   null,   0,   0);  
          }  
  不知道linux是什么效果...Top

相关问题

关键词

得分解答快速导航

  • 帖主:strangerryf
  • gtlang78

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo