1.将你想绘制的东西做成一个类 如: public class myLine { int x=0,y=0;
public myLine() { }
public myLine(int x,int y) { this.x=x;this.y=y; } public void draw(Graphics g) { Graphics2D g2d=(Graphics2D)g;
g.drawLine(x,y); } }2.从JPanel派生一个画板类 public class myCanvas extends JPanel implements MouseMotionListener { Vector mapObject=null;//用来保存对象 int mouseNum=0; Point oldPt=new Point(); Point newPt=new Point();
public myCanvas() { mapObject=new Vector(); } public void paint(Graphics g) { for(int i=0;i<mapObject.size();i++) { myLine tmpLine=(myLine)mapObject.get(i);
你串口每取一个点,new 一个Point(x,y),将对象压入数组,repaint(),这样保证每生成一个对象,都会实时绘出来,做一个全图显示函数,就可保证全部显示出来。//在每个map类中,如myLine中,加入一个取范围函数,如: ... public Rectangle getMapRect() { return new Rectangle(startP.x,startP.y,endP.x,Endp.y); }...在管理类中,增加取全部图元的范围函数,如在myCanvas ... public Rectangle getAllRect() { if(mapObject.size()==0)//如果没有对象 return this.getSize();//返回Panel的范围 int topLeftX=this.getSize().getX();//用Panel的范围作初始 int topLeftY=this.getSize().getX();//用Panel的范围作初始 int width=this.getSize().getWidth();//用Panel的范围作初始 int height=this.getSize().getHeight();//用Panel的范围作初始 for(int i=0;i<mapObject.size();i++) { myLine line=(myLine)mapObject.get(i);//获取每个myLine对象
可以看看相关的资源,和文档中的 java.awt.* 中的东西。
保证划出的点再面板内不能,获得面板的区域,在获得鼠标的输入位置进行比较判断。
建议可不可以利用java来调用Open GL,那你的这个东西就容易了。或者找找java有没有Open GL的接口
,也可以自己编接口程序。
如:
public class myLine
{
int x=0,y=0;
public myLine()
{
}
public myLine(int x,int y)
{
this.x=x;this.y=y;
} public void draw(Graphics g)
{
Graphics2D g2d=(Graphics2D)g;
g.drawLine(x,y);
}
}2.从JPanel派生一个画板类
public class myCanvas extends JPanel implements MouseMotionListener
{
Vector mapObject=null;//用来保存对象
int mouseNum=0;
Point oldPt=new Point();
Point newPt=new Point();
public myCanvas()
{
mapObject=new Vector();
} public void paint(Graphics g)
{
for(int i=0;i<mapObject.size();i++)
{
myLine tmpLine=(myLine)mapObject.get(i);
tmpLine.draw(g);
}
} public void mouseClicked(MouseEvent e)
{
if(e.getButton()==e.BUTTON1)//如果按下左键
{
if(mouseNum>0)//如果是第二次按下
{
newPt.x=e.getX();
newPt.y=e.getY(); myLine tmpLine=new myLine(oldPt,newPt);
mapObjetc.add(tmpLine);
mouseNum=0;
}
else
{
oldPt.x=e.getX();
oldPt.y=e.getY();
mouseNum++;
}
}
}大概思路就是这样,我是随手写的,可能有些语法不对,主要是想绘你些思路。
坐标值现在是从串口获得的,然后再实时在面板上画出来,保证在一定区域内。请问vaminal兄,在缩小的时候,前面显示的点要怎样保存起来,用什么方法?请各位高手不吝指点!
画图的模式用异或方式,在移动时,先在原位置上画一条,覆盖原来那条,之后再画出一条新的,这样就产生了动态画图的效果,有一本专门的JAVA2的书,就是完整的讲解了JAVA画图!
...
public Rectangle getMapRect()
{
return new Rectangle(startP.x,startP.y,endP.x,Endp.y);
}...在管理类中,增加取全部图元的范围函数,如在myCanvas
...
public Rectangle getAllRect()
{
if(mapObject.size()==0)//如果没有对象
return this.getSize();//返回Panel的范围 int topLeftX=this.getSize().getX();//用Panel的范围作初始
int topLeftY=this.getSize().getX();//用Panel的范围作初始
int width=this.getSize().getWidth();//用Panel的范围作初始
int height=this.getSize().getHeight();//用Panel的范围作初始 for(int i=0;i<mapObject.size();i++)
{
myLine line=(myLine)mapObject.get(i);//获取每个myLine对象
if(topLeftX<line.getMapRect().getX())
topLeftX=line.getMapRect().getX(); if(topLeftY<line.getMapRect().getY())
topLeftY=line.getMapRect().getY(); if(Width<line.getMapRect().getWidth())
hidth=line.getMapRect().getWidth();
if(height<line.getMapRect().getHeight())
height=line.getMapRect().getHeight();
}
return new Rectangle(topLeftX,topLeftY,width,height);
}//复位显示所有图形
public void zoomToShowAllMap()
{
if(this.getCurFunction()==25)//如果是复位图形
{
mapRectangle mapRect=getAllMapObjectsRect();
Dimension canvasDimension=this.getSize();
if(getAllMapObjectsRect()==null)
return;
//求取画布的大小
int cW=canvasDimension.width;
int cH=canvasDimension.height;
//获取包含所有图元的最小矩形的大小
float fW=(float)mapRect.getWidth();
float fH=(float)mapRect.getHeight();
int mW=mapTools.DLtoVL(fW);//宽
int mH=mapTools.DLtoVL(fH);//高
//计算缩放比例
float blc1,blc2;
blc1=(float)(mW)/(float)cW;//水平比例
blc2=(float)(mH)/(float)cH;//垂直比例
if(blc1<blc2)
blc1=blc2;
//保存新比例尺及原点
mapTools.mapBlc*=blc1;
mapTools.xStart=mapRect.getTopLeftX();
mapTools.yStart=mapRect.getTopLeftY(); repaint();
}
}