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新手,请大虾们多多指教!
4 个解决方案
#1
import java.awt.geom.*;
...
Line2D line = new Line2D.Float(x1, y1, x2, y2);
graphics2d.draw(line);
...
Line2D line = new Line2D.Float(x1, y1, x2, y2);
graphics2d.draw(line);
#2
谢谢gtlang78的指点,好像可以画出部分效果了。刚刚发现截断的现象是由于垂直放大了100倍引起的,所以只需要在构造line的时候对y1,y2乘100就可以了。而且Java画线的速度明显快于C#,估计是没有用C#的泛型ArrayList,而且读文件操作没有用到bufferedstream。
剩下的问题是,如何避免图像被遮盖时的重画过程?
剩下的问题是,如何避免图像被遮盖时的重画过程?
#3
晕...
使用Windows中的NetBeans生成的jar包,发现在Linux中开始时无法绘制。只有发生遮盖等事件引发重画才有显示
使用Windows中的NetBeans生成的jar包,发现在Linux中开始时无法绘制。只有发生遮盖等事件引发重画才有显示
#4
呼.................
求人不如求己
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是什么效果...
求人不如求己
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是什么效果...
#1
import java.awt.geom.*;
...
Line2D line = new Line2D.Float(x1, y1, x2, y2);
graphics2d.draw(line);
...
Line2D line = new Line2D.Float(x1, y1, x2, y2);
graphics2d.draw(line);
#2
谢谢gtlang78的指点,好像可以画出部分效果了。刚刚发现截断的现象是由于垂直放大了100倍引起的,所以只需要在构造line的时候对y1,y2乘100就可以了。而且Java画线的速度明显快于C#,估计是没有用C#的泛型ArrayList,而且读文件操作没有用到bufferedstream。
剩下的问题是,如何避免图像被遮盖时的重画过程?
剩下的问题是,如何避免图像被遮盖时的重画过程?
#3
晕...
使用Windows中的NetBeans生成的jar包,发现在Linux中开始时无法绘制。只有发生遮盖等事件引发重画才有显示
使用Windows中的NetBeans生成的jar包,发现在Linux中开始时无法绘制。只有发生遮盖等事件引发重画才有显示
#4
呼.................
求人不如求己
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是什么效果...
求人不如求己
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是什么效果...