200分求APPLET刷新问题 的确要重写canvas的paint()方法。因为小窗口只是遮住了canvas,并没有影响applet,所以applet的paint不会被调用。你把你的那个canvas写成另外的一个类,在这个类中再写一个针对canvas的paint方法,试试看。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你的draw()是不是应该放在canvas里,由paint(Graphics g)调用,把Graphics g = canvas.getGraphics();去掉 这里的paint(Graphics g)应该是canvas里的paint 对,我也觉得那个paint()应该是canvas里的paint(),可我在代码中根本不知怎么写到canvas中去啊,我试试 stamp80(清风扑面) 的将canvas另写一个类看看 问题解决了,是重新写了一个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中就不止出一个矩形框了? 我也正在写applet,关注,学习用异或模式啊? 我觉得应该是这样的:你说的这种情况,重绘时只是重绘canvas,并不是整个applet都被重绘,因为拖的窗口只是在canvas上移动,这是个人看法g.setXORMode(canvas.getBackground());具体看JDK文档,似乎只是颜色的交替,对于无数个矩形框,我觉得你是否应该repaint()一下? 在mouseDragged里调用容器的repaint()方法 郁闷,CSDN真TMD慢,从上午看完那贴子后就一直进不来了,在那个贴子里给pxboy(阿土仔) 老兄结贴也一直没结成功.我先试试上面的方法,再次谢了! 刚刚试过了,如果我在mouseDragged里加上canvas.repaint(),是可以实现始终只是拖动着一个矩形,可这样一样,屏幕闪烁得太厉害了.因为我的canvas的paint()方法中有个drawImg(),在拖动过程中,屏幕在不停的重画图,闪得好厉害啊.如果我是加APPLET的 repaint(),则没有作用的.该如何解决啊,老兄 请问在你的class myCanvas extends Canvas{ public void paint(Graphics g){ System.out.println("调用canvas刷新"); drawImg(); }}drawImg()是指代什么? 那你在paint里绘矩形,repaint()还是要的 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)); } 绘制操作是放在paint里的,最好别处不要放,不然到处都可以绘制组件,不好控制 谢过 pxboy(阿土仔)老兄了.我觉得你的方法还是不太可行的啊,在整个的拖动过程中,会产生无数个的事件的,如上面的代码,则会拼命的刷新myCanvas,这样一来也就会拼命的调用drawImg()了,这会引起整个屏幕闪烁的很厉害的.(我的drawImg()中画的内容很多的).我觉得是否应该在画的时候让现在已经有的图保持不动,要刷新也只是拖出来的那个矩形去刷新,那样可能就会达到要求了.找了一份资料看,g.setXORMode(canvas.getBackground());这种模式就是实现这种要求的,上面画的内容更新,而下面已经画好的内容不更新,我觉得这个模式应该是需要用上的.还有,和我上面同样的代码,我以前写过一个application的JAVA画图小程序,在那里面居然在画矩形的时候好好的,始终只是显示一根线而已,不知把它移植到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)); g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1)); //画两次 } //moveX1,moveY1为鼠标点下时的坐标点 } };将那个矩形画两次就看不到无数个矩形了,始终只能看到一个,不过只有在拖动的过程中才看得到矩形,一停下鼠标不拖动就被另一个画的刷新成背景色了 楼主你还注意到rectangle有一个方法是getBounds。它能得到你所画矩形的外框,你只要拖动鼠标时注意repaint(getBounds())这个矩形外框,就不用刷新整个canvas而只刷新这个矩形框了。 to stamp80(清风扑面) :我觉得在这种情况下,如果鼠标一拖动就用刷新总是不太好的吧,即使只是刷新矩形范围内的部分,也会给人太过闪烁的感觉的吧,我以前见过别人用APPLET做的,也是在原有的图上拖鼠标画出一个矩形出来,那种效果很好的,底下的图是一点都不闪烁的,连边拖边画的矩形的闪烁也不是很明显.我上面的方法就是那个边拖边画的矩形闪烁太过明显,还有,当鼠标停止不动的时候,那个矩形会消失的(给第二次画的擦掉了),这点感觉不爽. [新手求教]容器输出的问题 snmp4j的问题,请高手们帮忙看看,谢谢! java中锁的问题 怎样实现如下界面 玩转JEditorPane的高手进来帮下忙...... 怎么做模糊查询呢? 为什么看不到结果? 大家开发java程序都用什么工具啊? 有关JScrollBar的问题 用良心问问自己:花过多少心思考虑过软件的质量?(冒着丢失信誉分的危险提醒大家) 请帮我理解下面这些不常用的类 使用JAVA来开发游戏,不知道大家怎么看?
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中就不止出一个矩形框了?
用异或模式啊?
你说的这种情况,重绘时只是重绘canvas,并不是整个applet都被重绘,因为拖的窗口只是在canvas上移动,这是个人看法g.setXORMode(canvas.getBackground());
具体看JDK文档,似乎只是颜色的交替,对于无数个矩形框,我觉得你是否应该repaint()一下?
如果我是加APPLET的 repaint(),则没有作用的.该如何解决啊,老兄
class myCanvas extends Canvas{
public void paint(Graphics g){
System.out.println("调用canvas刷新");
drawImg();
}
}drawImg()是指代什么?
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));
}
找了一份资料看,g.setXORMode(canvas.getBackground());这种模式就是实现这种要求的,上面画的内容更新,而下面已经画好的内容不更新,我觉得这个模式应该是需要用上的.还有,和我上面同样的代码,我以前写过一个application的JAVA画图小程序,在那里面居然在画矩形的时候好好的,始终只是显示一根线而已,不知把它移植到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));
g.drawRect((int)moveX1,(int)moveY1,(int)(x-moveX1),(int)(y-moveY1));
//画两次
}
//moveX1,moveY1为鼠标点下时的坐标点
}
};
将那个矩形画两次就看不到无数个矩形了,始终只能看到一个,不过只有在拖动的过程中才看得到矩形,一停下鼠标不拖动就被另一个画的刷新成背景色了
我觉得在这种情况下,如果鼠标一拖动就用刷新总是不太好的吧,即使只是刷新矩形范围内的部分,也会给人太过闪烁的感觉的吧,我以前见过别人用APPLET做的,也是在原有的图上拖鼠标画出一个矩形出来,那种效果很好的,底下的图是一点都不闪烁的,连边拖边画的矩形的闪烁也不是很明显.
我上面的方法就是那个边拖边画的矩形闪烁太过明显,还有,当鼠标停止不动的时候,那个矩形会消失的(给第二次画的擦掉了),这点感觉不爽.