因为每次鼠标拖动的时候,图形都么重绘,虽然你重载了update,但是由于你的面积比较大,所以失效面积也大,难以避免会有抖动的情况。所以如果用双缓冲的话,要好的多。给个双缓冲的例子你:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;public class DoubleBuffer extends Applet
{
int gap=3;
int mx,my;
boolean flicker=true;
Image buffer=null;
int w,h;
public void init(){
Dimension d=getSize();
w=d.width;
h=d.height;
buffer=createImage(w,h);
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent me){
mx=me.getX();
my=me.getY();
flicker=false;
repaint();
}
public void mouseMoved(MouseEvent me){
mx=me.getX();
my=me.getY();
flicker=true;
repaint();
}
});
}
public void paint(Graphics g){
Graphics screengc=null;
if(!flicker){
screengc=g;
g=buffer.getGraphics();
}
g.setColor(Color.blue);
g.fillRect(0,0,w,h);
g.setColor(Color.red);
for(int i=0;i<w;i+=gap)
g.drawLine(i,0,w-i,h);
for(int i=0;i<h;i+=gap)
g.drawLine(0,i,w,h-i);
g.setColor(Color.black);
g.drawString("推拽鼠标转换到双缓冲模式",10,h/2);
g.setColor(Color.yellow);
g.fillOval(mx-gap,my-gap,gap*2+1,gap*2+1);
if(!flicker){
screengc.drawImage(buffer,0,0,null);
}
}
public void update(Graphics g){
paint(g);
}
}
/*
<APPLET CODE="DoubleBuffer" WIDTH="600" HEIGHT="600">
</APPLET>
*/
import java.awt.*;
import java.applet.*;
import java.awt.event.*;public class DoubleBuffer extends Applet
{
int gap=3;
int mx,my;
boolean flicker=true;
Image buffer=null;
int w,h;
public void init(){
Dimension d=getSize();
w=d.width;
h=d.height;
buffer=createImage(w,h);
addMouseMotionListener(new MouseMotionAdapter(){
public void mouseDragged(MouseEvent me){
mx=me.getX();
my=me.getY();
flicker=false;
repaint();
}
public void mouseMoved(MouseEvent me){
mx=me.getX();
my=me.getY();
flicker=true;
repaint();
}
});
}
public void paint(Graphics g){
Graphics screengc=null;
if(!flicker){
screengc=g;
g=buffer.getGraphics();
}
g.setColor(Color.blue);
g.fillRect(0,0,w,h);
g.setColor(Color.red);
for(int i=0;i<w;i+=gap)
g.drawLine(i,0,w-i,h);
for(int i=0;i<h;i+=gap)
g.drawLine(0,i,w,h-i);
g.setColor(Color.black);
g.drawString("推拽鼠标转换到双缓冲模式",10,h/2);
g.setColor(Color.yellow);
g.fillOval(mx-gap,my-gap,gap*2+1,gap*2+1);
if(!flicker){
screengc.drawImage(buffer,0,0,null);
}
}
public void update(Graphics g){
paint(g);
}
}
/*
<APPLET CODE="DoubleBuffer" WIDTH="600" HEIGHT="600">
</APPLET>
*/
这样的话就用doulbe buffer线试试啦,不行在想办法.或则可以像flash中那样,在拖动的时候只显示一个方框,在released mouse以后再把整个图片copy过来。