Java图像闪烁
嗨,伙计们,我正在做一个程序,该程序应该在输入键时更改图像。我对每张图像都使用了一个动画gif,我想知道为什么在运行时只有我的从左到右的动画gif会闪烁。我在论坛上看到,java默认启用双缓冲,但我明确设置了它以防万一,为什么会发生这种情况Java图像闪烁,java,animated-gif,Java,Animated Gif,嗨,伙计们,我正在做一个程序,该程序应该在输入键时更改图像。我对每张图像都使用了一个动画gif,我想知道为什么在运行时只有我的从左到右的动画gif会闪烁。我在论坛上看到,java默认启用双缓冲,但我明确设置了它以防万一,为什么会发生这种情况 我没有运行您的代码,但在我看来,这可能是一种常见的将图像设置为值的“已经存在”综合征。当您按下/按住某个键时,它会被发送到应用程序/窗口多次,通常在第一次按键和重复之间会有一些延迟。如果您添加一个实例变量来记住图像的状态或上次按下的键,然后只在按下其他键时更
我没有运行您的代码,但在我看来,这可能是一种常见的将图像设置为值的“已经存在”综合征。当您按下/按住某个键时,它会被发送到应用程序/窗口多次,通常在第一次按键和重复之间会有一些延迟。如果您添加一个实例变量来记住图像的状态或上次按下的键,然后只在按下其他键时更改图像,我认为这可能会解决您的问题
这可能不是正常情况,除了您没有缓存图标,而是在每次更改图像时创建一个新的ImageIcon对象,因此每次按下一个键时,图标都会从文件中重新加载。这也可能导致闪烁。好的,我试着用你正在使用的实际图像运行代码,这些图像可以在谷歌图像搜索中找到 看起来左右图像有问题。我注意到后面和前面的图像没有闪烁。
因此,如果您尝试用前后图像替换左右图像,您将看到没有闪烁:也许您应该尝试动画gif以外的图像格式?自己制作动画并使用PNG或JPEG。动画GIF是基于味觉的,您需要依靠java实现来制作您想要的动画。如果你自己做动画,你可能会有更好的运气。为什么会发生这种情况?信息太少了,尽管需要注意以下几点:1基于字符串的ImageIcon构造函数在网络上的JApplet中不起作用。2图像应该加载到构造函数中并缓存,而不是每次按下一个键都重新加载。java默认启用双缓冲,但我已明确地将其设置在何处?4.那代码乱七八糟。请在将来对源代码使用一致的逻辑代码行缩进。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KeyEventAnimation extends JApplet implements KeyListener
{
Image img;
JLabel zil;
int x=0, y=0, speed=10; // x,y coordinates and how many pixels move
JPanel pane;
public void init( )
{
pane = new JPanel( );
pane.setLayout( null );
pane.setBackground( Color.WHITE );
img = getImage( getCodeBase( ), "zil_walk_front.gif" );
zil = new JLabel( new ImageIcon(img) );
zil.setSize( img.getWidth(this), img.getHeight(this) );
addKeyListener(this);
pane.add( zil, 0, 0 );
add( pane, BorderLayout.CENTER );
setFocusable(true);
}
public void keyReleased( KeyEvent ke ) { }
public void keyTyped( KeyEvent ke ) { }
public void keyPressed( KeyEvent ke )
{
int code = ke.getKeyCode( );
if( code == KeyEvent.VK_UP ){
y -= speed;
zil.setIcon(new ImageIcon("zil_walk_back.gif"));
} else if ( code == KeyEvent.VK_DOWN ){
y += speed;
zil.setIcon(new ImageIcon("zil_walk_front.gif"));
} else if ( code == KeyEvent.VK_LEFT ){
x -= speed;
zil.setIcon(new ImageIcon("zil_walk_left.gif"));
} else if ( code == KeyEvent.VK_RIGHT ){
x += speed;
zil.setIcon(new ImageIcon("zil_walk_right.gif"));
}
zil.setLocation(x,y);
}
}