Java изображение мерцание - PullRequest
0 голосов
/ 17 мая 2011

Привет, ребята. Я работаю над программой, которая должна изменять изображения при вводе ключа. Я использовал анимированный 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); 
    }
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2011

Хорошо, я попытался запустить код с теми изображениями, которые вы используете (они доступны в поиске картинок Google).

Похоже, что-то не так с левыми правыми изображениями. Я заметил, что задние и передние изображения не мерцают. Поэтому, если вы попытаетесь заменить левое и правое изображениями заднего и лицевого изображения, вы увидите, что мерцания нет:)

0 голосов
/ 17 мая 2011

Я не запустил ваш код, но мне кажется, что это может быть распространенным случаем синдрома "изображение-значение-это-уже-есть".Когда вы нажимаете клавишу (/ удерживаете ее нажатой), она отправляется в приложение / окно несколько раз (как правило, между первым нажатием клавиши и повторениями есть некоторая задержка).Если вы добавите переменную экземпляра для запоминания состояния изображения (или последней нажатой клавиши), а затем измените изображение только при нажатии клавиши другая , я думаю, что это может решить вашу проблему.

Это может быть не так обычно, за исключением того факта, что вы не кэшируете свои значки (вы создаете новый объект ImageIcon каждый раз, когда вы меняете изображение), поэтому каждый раз, когда нажимается клавиша, значок перезагружаетсяиз файла.Это также может вызвать мерцание.

...