200分求APPLET刷新问题

cql0007 2003-10-10 09:13:09
写出一个APPLET,主要是用来画图用的.如果我的APPLET里不再加别的容器,图就直接画在APPLET之上(APPLET是继承Panel,应该也是个Panel吧).这样结果一切都如意.

但因为我的APPLET第一行有一行是按钮,如果将图直接画在APPLET之上,那么按钮那一行也会占去我的坐标位,真正开始画的原点的坐标已经不是(0,0)了,而是(0,那个按钮行的高度了)。于是,我就在APPLET的中间区域(画图区域)加了一个Canvas,将图全部都画在Canvas之上,这样就保证了坐标点的原点了。
部分代码如下:
public void draw(){
Graphics g = canvas.getGraphics();
g.drawLine(.........);
.....
}
public void paint(Graphics g){
canvas.repaint();
draw();
}
在每次当APPLET有刷新的时候就调用draw()将图重新画一次,updata没有重写.
这个时候出一问题:
当我有别的窗口从APPLET之上拖过的时候,如果别的窗口很小,只是在我的canvas上拖动的时候,APPLET并不会调用我自己写的那个paint()方法,而只是用背景色填充了被别的窗口拖过的地方,没有重新把图画上,我不知是为什么,有人说是要重写canvas的paint()方法,可如果我上面写的paint()方法不能被刚刚那种情况调用,那该如何写了?

但如果我的图是直接画在APPLET之上,不用一个canvas的话,则上面的刷新一切正常。
...全文
116 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
cql0007 2003-10-16
  • 打赏
  • 举报
回复
to stamp80(清风扑面) :
我觉得在这种情况下,如果鼠标一拖动就用刷新总是不太好的吧,即使只是刷新矩形范围内的部分,也会给人太过闪烁的感觉的吧,我以前见过别人用APPLET做的,也是在原有的图上拖鼠标画出一个矩形出来,那种效果很好的,底下的图是一点都不闪烁的,连边拖边画的矩形的闪烁也不是很明显.
我上面的方法就是那个边拖边画的矩形闪烁太过明显,还有,当鼠标停止不动的时候,那个矩形会消失的(给第二次画的擦掉了),这点感觉不爽.
stamp80 2003-10-12
  • 打赏
  • 举报
回复
楼主你还注意到rectangle有一个方法是getBounds。它能得到你所画矩形的外框,你只要拖动鼠标时注意repaint(getBounds())这个矩形外框,就不用刷新整个canvas而只刷新这个矩形框了。
cql0007 2003-10-11
  • 打赏
  • 举报
回复
刚刚试过一种方法了: 勉强还可行.
MouseMotionListener MouseMotionListener1 = new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
x = e.getPoint() .x;
y = e.getPoint() .y;
Graphics g = canvas.getGraphics();
g.setXORMode(canvas.getBackground());//是应该用这种模式吧;????
g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
//画两次
}
//moveX1,moveY1为鼠标点下时的坐标点
}
};
将那个矩形画两次就看不到无数个矩形了,始终只能看到一个,不过只有在拖动的过程中才看得到矩形,一停下鼠标不拖动就被另一个画的刷新成背景色了
cql0007 2003-10-11
  • 打赏
  • 举报
回复
谢过 pxboy(阿土仔)老兄了.

我觉得你的方法还是不太可行的啊,在整个的拖动过程中,会产生无数个的事件的,如上面的代码,则会拼命的刷新myCanvas,这样一来也就会拼命的调用drawImg()了,这会引起整个屏幕闪烁的很厉害的.(我的drawImg()中画的内容很多的).

我觉得是否应该在画的时候让现在已经有的图保持不动,要刷新也只是拖出来的那个矩形去刷新,那样可能就会达到要求了.
找了一份资料看,g.setXORMode(canvas.getBackground());这种模式就是实现这种要求的,上面画的内容更新,而下面已经画好的内容不更新,我觉得这个模式应该是需要用上的.

还有,和我上面同样的代码,我以前写过一个application的JAVA画图小程序,在那里面居然在画矩形的时候好好的,始终只是显示一根线而已,不知把它移植到APPLET中后有什么不同了,那种效果就不出来了.
cql0007 2003-10-10
  • 打赏
  • 举报
回复
问题解决了,是重新写了一个canvas类.
class myCanvas extends Canvas{

public void paint(Graphics g){
System.out.println("调用canvas刷新");
drawImg();
}
}
然后添加到APPLET中去的是myCanvas的实例就行了,拼命的刷新,爽!
请pxboy(阿土仔)老兄去此处接分:
http://expert.csdn.net/Expert/topic/2297/2297515.xml?temp=.131222
在那个帖子发了很久,没人解决,也是100分,我想将这里的分全部留给stamp80(清风扑面) 了.

非常感谢两位老兄,不过对这里这种应用,以及这样用了之后的刷新调用机制,小弟不是太明白,两位不知是否能解释一二,谢谢!

另外:还有一个这样的问题小弟现在也没能解决:请教一下老兄:
在我的APPLET中有一个操作是用鼠标在APPLET之上拖出一个矩形出来,然后再操作.
MouseMotionListener MouseMotionListener1 = new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e){
x = e.getPoint() .x;
y = e.getPoint() .y;
Graphics g = canvas.getGraphics();
g.setXORMode(canvas.getBackground());//是应该用这种模式吧;????
g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
}
//moveX1,moveY1为鼠标点下时的坐标点
}
};
我想要的结果就是在拖动鼠标的过程中始终只能一个矩形框出来,可现在却出现了无数个矩形框,因为在拖动过程中产生了无数个的x,y.
就上面一样的代码,我在JAVA其它的应用程序中用了可以的,不知为何到了APPLET中就不止出一个矩形框了?
cql0007 2003-10-10
  • 打赏
  • 举报
回复
对,我也觉得那个paint()应该是canvas里的paint(),可我在代码中根本不知怎么写到canvas中去啊,我试试 stamp80(清风扑面) 的将canvas另写一个类看看
stamp80 2003-10-10
  • 打赏
  • 举报
回复
有理。
pxboy 2003-10-10
  • 打赏
  • 举报
回复
这里的paint(Graphics g)应该是canvas里的paint
pxboy 2003-10-10
  • 打赏
  • 举报
回复
你的draw()是不是应该放在canvas里,由paint(Graphics g)调用,把Graphics g = canvas.getGraphics();去掉
stamp80 2003-10-10
  • 打赏
  • 举报
回复
的确要重写canvas的paint()方法。因为小窗口只是遮住了canvas,并没有影响applet,所以applet的paint不会被调用。你把你的那个canvas写成另外的一个类,在这个类中再写一个针对canvas的paint方法,试试看。
pxboy 2003-10-10
  • 打赏
  • 举报
回复
绘制操作是放在paint里的,最好别处不要放,不然到处都可以绘制组件,不好控制
pxboy 2003-10-10
  • 打赏
  • 举报
回复



boolean isDrag = false;
int moveX1 = 0;
int moveY1 = 0;
int moveX2 = 0;
int moveY2 = 0;


myCanvas .addMouseListener(new MouseAdapter()
{
public void mousePressed(MouseEvent e)
{
moveX1 = e.getX();
moveY1 = e.getY();
isDrag = true;
}
public void mouseReleased(MouseEvent e)
{
isDrag = false;
myCanvas .repaint();

}
});

myCanvas .addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
isDrag = true;
myCanvas .repaint();
moveX2 = e.getPoint().x;
moveY2 = e.getPoint().y;
}
});

public void paint(Graphics g)
{
drawImg();
if(isDrag)
g.drawRect( (int)moveX1, (int)moveY1, (int) (moveX2 - moveX1), (int) (moveY2 - moveY1));
}
pxboy 2003-10-10
  • 打赏
  • 举报
回复
那你在paint里绘矩形,repaint()还是要的
dingdong1104 2003-10-10
  • 打赏
  • 举报
回复
请问在你的
class myCanvas extends Canvas{

public void paint(Graphics g){
System.out.println("调用canvas刷新");
drawImg();
}
}



drawImg()是指代什么?
Yanbin_Q 2003-10-10
  • 打赏
  • 举报
回复
up
cql0007 2003-10-10
  • 打赏
  • 举报
回复
刚刚试过了,如果我在mouseDragged里加上canvas.repaint(),是可以实现始终只是拖动着一个矩形,可这样一样,屏幕闪烁得太厉害了.因为我的canvas的paint()方法中有个drawImg(),在拖动过程中,屏幕在不停的重画图,闪得好厉害啊.
如果我是加APPLET的 repaint(),则没有作用的.

该如何解决啊,老兄
cql0007 2003-10-10
  • 打赏
  • 举报
回复
郁闷,CSDN真TMD慢,从上午看完那贴子后就一直进不来了,在那个贴子里给pxboy(阿土仔) 老兄结贴也一直没结成功.

我先试试上面的方法,再次谢了!
207 2003-10-10
  • 打赏
  • 举报
回复
学习!
pxboy 2003-10-10
  • 打赏
  • 举报
回复
在mouseDragged里调用容器的repaint()方法
pxboy 2003-10-10
  • 打赏
  • 举报
回复
我觉得应该是这样的:
你说的这种情况,重绘时只是重绘canvas,并不是整个applet都被重绘,因为拖的窗口只是在canvas上移动,这是个人看法

g.setXORMode(canvas.getBackground());
具体看JDK文档,似乎只是颜色的交替,

对于无数个矩形框,我觉得你是否应该repaint()一下?
加载更多回复(1)

62,614

社区成员

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

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