Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java图像闪烁_Java_Animated Gif - Fatal编程技术网

Java图像闪烁

Java图像闪烁,java,animated-gif,Java,Animated Gif,嗨,伙计们,我正在做一个程序,该程序应该在输入键时更改图像。我对每张图像都使用了一个动画gif,我想知道为什么在运行时只有我的从左到右的动画gif会闪烁。我在论坛上看到,java默认启用双缓冲,但我明确设置了它以防万一,为什么会发生这种情况 我没有运行您的代码,但在我看来,这可能是一种常见的将图像设置为值的“已经存在”综合征。当您按下/按住某个键时,它会被发送到应用程序/窗口多次,通常在第一次按键和重复之间会有一些延迟。如果您添加一个实例变量来记住图像的状态或上次按下的键,然后只在按下其他键时更

嗨,伙计们,我正在做一个程序,该程序应该在输入键时更改图像。我对每张图像都使用了一个动画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); 
    }
}