急问:在一个canvas上画一个矩形,矩形随鼠标动而跟着变,可是我写的老是闪得太厉害了,而且鼠标不动时则矩形没了?

cql0007 2003-12-12 12:23:10
在这个canvas上已经有别的背景画图内容了.我是做一个矩形框选择的玩意儿,老做不好.
其中:x,y是当前鼠标坐标,startX,startY是鼠标按下时的坐标,endX,endY是松开鼠标时的坐标.用XORMOde画.

MouseMotionListener MouseMotionListener1 = new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
message = "Í϶¯Êó±ê»­Ïß";
x = e.getPoint() .x;
y = e.getPoint() .y;

Graphics g = canvas.getGraphics();
g.setXORMode(getBackground() ) ;

//拖动鼠标的时候随着鼠标画出一个矩形框;
g.drawRect(startX,startY,x-startX,y-startY);
g.drawRect(startX,startY,x-startX,y-startY);

}
public void mouseMoved(MouseEvent e){
x = e.getX();
y = e.getY();
tf.setText(message+"\tX="+e.getX() +"\tY="+e.getY() );
}
};

MouseListener mouseListener = new MouseAdapter(){
public void mousePressed(MouseEvent e){
startX = x = endX = e.getPoint() .x;
startY = y = endY = e.getPoint() .y;
message = "°´ÏÂÊó±ê";
tf.setText(message) ;
}
public void mouseReleased(MouseEvent e){
endX = e.getPoint() .x;
endY = e.getPoint() .y;
Graphics g = canvas.getGraphics();
//松开鼠标画出这个矩形框
g.drawRect(startX,startY,endX-startX,endX-startY);

}
};

如上的代码,我在鼠标拖动的时候是有矩形框出来,但闪烁的太厉害了,几乎看不到,最关键的就是当我的鼠标不拖动,停止的时候,那个框就没有了.]

我是用异或模式画的,在拖动鼠标的时候是边画框边擦框,导致了这个结果,我该如何做了?我在网上见过别人画的这个矩形框很稳定的,鼠标到哪,他就画到哪?谢谢!
...全文
402 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Acylas 2003-12-12
你应该重载paint方法去处理比较好,并且paint方法里面先调用super.paint(g);
而在鼠标事件里面只要计下鼠标的位置,和是否拖动还是移动等就行了.
我曾经做过甘特图,有拖动等等处理,而且在很多图(类似ms porject)的情况下都不会闪烁
  • 打赏
  • 举报
回复
YanbinQiu 2003-12-12
swing实现了双缓冲
  • 打赏
  • 举报
回复
Dickensi 2003-12-12
用双缓冲消除闪烁!
  • 打赏
  • 举报
回复
cuij7718 2003-12-12
http://www.chinajavaworld.net/forum/forums.cgi?forum=21
有一个画图程序的例子,说的很清楚
  • 打赏
  • 举报
回复
cql0007 2003-12-12
终于明白老兄所说的意思.问题终于解决了,这个问题困扰我个多月了,非常感谢simonhappy()

  • 打赏
  • 举报
回复
simonhappy 2003-12-12
你对于Java中事件理解不够.鼠标只要移动,就不停的产生鼠标事件.所以你的鼠标监听器就不停的处理.你不用担心次序,当鼠标重A移动到B,产生n个移动事件,这n个事件在系统事件线程中被按照次序发送个组件处理,所以每次处理对应的都是同一个点,你只要注意在监听器中记录位置就OK了.
  • 打赏
  • 举报
回复
rongwenfeng 2003-12-12
关注
  • 打赏
  • 举报
回复
cql0007 2003-12-12
多谢老兄了.
可我觉得在鼠标的移动过程中,坐标点始终在不停的变化,怎样才能分出前一点和当前点来了?对这点我也想了很久了,始终没有头绪,老兄帮忙想想看,这里具体该如何实现啊?多谢多谢!
  • 打赏
  • 举报
回复
simonhappy 2003-12-12
g.drawRect(startX,startY,x-startX,y-startY);////error
g.drawRect(startX,startY,x-startX,y-startY);
代码效果就是绘制然后马上擦除,就是闪烁的效果.
当前类留个字段记录鼠标位置.每次先取该字段(上次留下的),绘制矩形(擦除上次图形)
当前位置记录(下次用),然后绘制当前位置..
  • 打赏
  • 举报
回复
cql0007 2003-12-12
各位老大啊,没看清我的要求啊.我这个闪烁不是没实现双缓冲的那个闪烁.在我的图形处理的主程序中,双缓冲,重写paint()方法我都已经已经做到了.

我现在的问题是:画一个矩形的时候,那个矩形是要随着鼠标的移动而矩形框随着变化的啊,这个时候根本不能用刷新,这个矩形的下面还有一层别的很大的图,所以这里采用异或模式来画,跟下面的背景图无关了.

TO: simonhappy()
我觉得难实现你讲的那种情况就行了,只擦除上一次画的,始终还留一次当前的,那就矩形框会显示正常了,可如何做啊?
  • 打赏
  • 举报
回复
simonhappy 2003-12-12
g.drawRect(startX,startY,x-startX,y-startY);////error
g.drawRect(startX,startY,x-startX,y-startY);
写错了,应该擦除上一次的图形.
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2003-12-12 12:23
社区公告
暂无公告