大家好我正在研究一个应该在键输入时改变图像的程序。我为每个图像使用了动画gif,我想知道为什么只有我的左到右动画gif在运行时闪烁。我已经在论坛上看了一下,并且看到java默认启用了双缓冲,但是为了以防万一,我已经明确地设置了它,为什么会发生这种情况?
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);
}
}
答案 0 :(得分:0)
我没有运行你的代码,但在我看来,这可能是设置图像到价值已经是综合症的常见情况。当您按下一个键(/按住它)时,它会多次被发送到应用程序/窗口(第一次按键和重复之间通常会有一些延迟)。如果添加一个实例变量来记住图像的状态(或按下的最后一个键),然后仅在按下不同的键时更改图像,我认为这可能会解决您的问题。 / p>
这可能不是那么正常,除了你没有缓存你的图标(你每次更改图像时都要创建一个新的ImageIcon对象)所以每次按下一个键时,图标都会重新加载文件。这也可能导致闪烁。
答案 1 :(得分:0)
好的,我尝试使用您正在使用的实际图片运行代码(可在谷歌图片搜索中使用)。
左侧图像看起来有问题。我注意到后面和前面的图像没有闪烁。 因此,如果您尝试使用前后图像替换左右图像,您将看到没有闪烁:)