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