Java小程序过度闪烁

Java小程序过度闪烁,java,swing,paint,japplet,mouse-listeners,Java,Swing,Paint,Japplet,Mouse Listeners,我正在创建一个简单的射击图库类型的游戏。我已经创建了一个鼠标运动监听器,正在使用它在鼠标的当前位置绘制图像。这很好,但是当我移动光标时,图像会闪烁很多。我已经尝试了几个双缓冲教程,但是这些都不起作用 这是我的密码 public class ShootingGallery extends JApplet implements MouseMotionListener { //VARIABLES int mouseXPos; int mouse

我正在创建一个简单的射击图库类型的游戏。我已经创建了一个鼠标运动监听器,正在使用它在鼠标的当前位置绘制图像。这很好,但是当我移动光标时,图像会闪烁很多。我已经尝试了几个双缓冲教程,但是这些都不起作用

这是我的密码

    public class ShootingGallery extends JApplet implements MouseMotionListener {

        //VARIABLES
        int mouseXPos;
        int mouseYPos;
        Image myImage;
        private Image dbImage;
        private Graphics dbg;

        @Override
        public void init() {            
            setSize(800, 600);//SET UP CURSOR IMAGE
            myImage = getImage(getDocumentBase(),"spongebob.gif");
            addMouseMotionListener(this);//ADD ACTION LISTENERS
        }

        @Override
        public void mouseDragged(MouseEvent e) {            
            moveMouse(e); 
        }        

        @Override
        public void mouseMoved(MouseEvent e) {            
            moveMouse(e);
        }        

        public void moveMouse(MouseEvent e){            
              Graphics g = getGraphics();             
              mouseXPos = e.getX() - (myImage.getWidth(null) / 2);
              mouseYPos = e.getY() - (myImage.getHeight(null) / 2);     
              repaint();
        } 

        public void paint(Graphics g)
        {
              super.paint(g);            
              g.drawImage(myImage, mouseXPos, mouseYPos, this);
        }
   }

非常感谢对此问题提供的任何帮助

当鼠标经过屏幕时,鼠标运动监听器将被频繁调用,可能每个过渡像素调用一次。如果您经常绘制图像,您的代码可能无法跟上,导致图像闪烁。

Swing已经支持缓冲。只需在另一个容器(不是顶层容器)上绘制,请参见此处的代码:

public class ShootingGallery extends JApplet implements MouseMotionListener {

// VARIABLES
int mouseXPos;
int mouseYPos;
Image myImage;

@Override
public void init() {
    setSize(800, 600);// SET UP CURSOR IMAGE
    myImage = getImage(getDocumentBase(), "spongebob.gif");
    addMouseMotionListener(this);// ADD ACTION LISTENERS
    this.add(new PaintContainer());

}
@Override
public void mouseDragged(MouseEvent arg0) {
}

@Override
public void mouseMoved(MouseEvent e) {
    moveMouse(e);
    repaint();
}

public void moveMouse(MouseEvent e) {
    mouseXPos = e.getX() - (myImage.getWidth(null) / 2);
    mouseYPos = e.getY() - (myImage.getHeight(null) / 2);
}

public class PaintContainer extends JPanel {

     protected void paintComponent(Graphics g) {
         g.drawImage(myImage, mouseXPos, mouseYPos, this);
     }
}
}

与其重新绘制整个屏幕,不如只重新绘制将要更改的部分。我对java相当陌生,我该如何做呢?@extremecorders重新绘制管理器通常非常擅长解决这个问题,并相应地剪裁图形上下文,但是顶级联系人不是双缓冲的,这是问题的主要根源。你能提供一些代码示例吗?好的,有解决方法吗?我尝试使用工具箱将光标实际更改为图像。虽然这样做有效,但允许的最大尺寸却非常小。我正试图通过不同的方法来创建相同的效果,这将允许我拥有更大的图像。这将停止闪烁,但如果不创建子类,就没有办法做到这一点