请教关于applet画板的一些问题

blacksoul 2004-06-10 08:43:02
1.绘制填充式图形的时候,以鼠标拖动事件触发。以绘制矩形为例,起点确定,但是一旦鼠标快速的先向右下,再向左上移动的话,在起点周围会多处一些“渣子”出来,下面是小弟的源码:
//v是定义的向量
……
int tempwidth=0;
int tempheight=0;
int clearwidth=0;
int clearheight=0;
Point start=new Point(0,0);
Point clearstart=new Point(0,0);
for(i=0;i<v.size() - 1;i++){
Point p1 = (Point) v.elementAt(0);
Point p2 = (Point) v.elementAt(i+1);
Point p = (Point) v.elementAt(i);
//取矩形的长宽
tempwidth=Math.abs(p2.x-p1.x);
tempheight=Math.abs(p2.y-p1.y);
//矩形变小时清除范围的长宽
clearwidth=Math.abs(p.x-p1.x);
clearheight=Math.abs(p.y-p1.y);
//取起点
start.x=Math.min(p1.x,p2.x);
start.y=Math.min(p1.y,p2.y);
clearstart.x=Math.min(p.x,start.x);
clearstart.y=Math.min(p.y,start.y);

g.clearRect(clearstart.x-1,clearstart.y-1,clearwidth+1,clearheight+1);//这里我用的是清除,不知道还有没有什么方法呀。
g.fillRect(start.x,start.y,tempwidth,tempheight);
}
……
而且当点住鼠标拖动很多此的时候,效率就变的很低。求其他方法,望大虾指点迷津呀。
2.applet所在的浏览器窗口最小化之后再还原,画板所画的东西都不在了。不知道是怎么回事,小弟用的是一向量组来记录的鼠标事件获得的点。一旦鼠标释放,向量组清空。不知道是不是和这个有关系?(附带,怎么保存绘图过程)

分不够再给
...全文
107 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
blacksoul 2004-06-11
  • 打赏
  • 举报
回复
回tensiont(巴菲特):谢谢你的建议,你这种方法很好用,不过中间还有些细节我正在解决。
回zhushizu(从来就没有救世祖),以下是鼠标事件,很简单的几个动作,就是获得一些点:
void this_mouseDragged(MouseEvent e) {
int px=(int)e.getX();
int py=(int)e.getY();
Point p=new Point(px,py);
v.addElement(p);
repaint();
}

void this_mouseReleased(MouseEvent e) {
v.removeAllElements();
repaint();
}
blacksoul 2004-06-11
  • 打赏
  • 举报
回复
我是想即时的显示用户绘画的时候,矩形的形状变化,那样才更实用嘛。所以就用拖动的方法来获得点了,是很多点。也就是因为用了向量来记录,所以才会在拖动多次以后变得很慢。现在的想法是这样的,将所有的绘制的图形记录在Vector里面,然后绘画过程中矩形依旧使用上面的方法,然后在鼠标释放之后,清屏之后再将Vector里面记录的图形信息调出来重绘,那样屏幕就可能会干净一些。测试中…………
zhushizu 2004-06-11
  • 打赏
  • 举报
回复
试试用鼠标按下事件和放开来获得两个点可以嘛?
zhushizu 2004-06-11
  • 打赏
  • 举报
回复
呵呵,你是用鼠标拖动来选择点的嘛?这样的话会有很多的点哦

如果你要画的的一个矩形的话只要有两个点就可以了。也就是左上和右下就可以。那就不用拖拽事件来获得点了!!这样的话会出现小渣渣也是可以理解的。因为拖动的时候获得的点是很多的哦。

boyard 2004-06-11
  • 打赏
  • 举报
回复
(问题2)提供一个方法:将绘图过程中的图形元素以对象的形式依次保存一个Vector中。
ShaNiu 2004-06-11
  • 打赏
  • 举报
回复
d
zhushizu 2004-06-11
  • 打赏
  • 举报
回复
楼主怎么没有把鼠标的动作放上来。这个是关键哈,放上来大家一起研究吓


关于第二个问题
无论在VC还是Java中,窗口最小化之后再还原,就会重新调用paint(Graphics g)函数。所以把你的画图内容在paint()中重载就可以了
panpan221 2004-06-10
  • 打赏
  • 举报
回复
学习一下
tensiont 2004-06-10
  • 打赏
  • 举报
回复
忘了一点!
public class MyRect implements Shape{

...

}
tensiont 2004-06-10
  • 打赏
  • 举报
回复
对于第一个问题,不太清楚。

第二个问题。当浏览器窗口最小化之后再还原,就会重新调用paint(Graphics g)函数,如果你在paint里面没有重画前面的内容,画板自然清空。

我觉得可以这样解决,用一个ArrayList保存你所画的所有的图形(Circle,Rect等),然后根据保存图形的类型重新再画。比如当你选择画矩形时,首先生成一个矩形类MyRect的实例myRect01,加到ArrayList里,以便重画。
例子:
//MyRect.java
//主要是为了记录矩形的各个元素,如填充颜色等等
public interface Shape{
public void draw(Graphics g);
}
public class MyRect {

Point start;
Point end;
Color fillColor;

public MyRect(){}
//其他数据方法
public void setStart(Point start){}
//...

public void draw(Graphic g){
//draw hanlder
}
}

还可以定义圆等其他的图形类型。

public ArrayList items=new ArrayList(); //全局变量
当你画好一个矩形以后,
可以产生一个MyRect实例 myRect01
并且 items.add(myRect01);

在你的paint方法中可以这样

public void paint(Graphic g){

for(int i=0;i<items.length();i++){
(Shape)items.get(i).draw(g);
}
}

//写的有点急,如果函数不对,自己核对一下吧。
zhengy2003 2004-06-10
  • 打赏
  • 举报
回复
"保存绘图过程"?以文件形式保存?

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧