如何在此代码中停止闪烁

时间:2013-07-10 10:34:56

标签: java flicker racing

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/*
<applet height=800 width=600 code="RaceApplet.java"></applet>
*/

public class RaceApplet extends JApplet implements KeyListener
{
    private Image player;
    private Image bg;
    private int nx = 800;
    private int ny = 0;
    private Rectangle rect;

    private void loadPicture()
    {
        bg = new ImageIcon("RaceBack.png").getImage();
        player = new ImageIcon("KD//KDE.png").getImage();
    }

    public void init()
    {
        loadPicture();
        rect = new Rectangle(250, 93, 50, 50);
        this.addKeyListener(this);
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.green);
        g.fillRect(0, 0, 34567, 34567);
        g.drawImage(bg, nx - 800, ny, null);
        g.drawImage(player, rect.x, rect.y, null);

    }

    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() == KeyEvent.VK_RIGHT )
        {
            nx = nx - 20;
            player = new ImageIcon("KD//KDE.png").getImage();
        }
        if( e.getKeyCode() == KeyEvent.VK_LEFT )
        {
            nx = nx + 20;
            player = new ImageIcon("KD//KDW.png").getImage();
        }
        if( e.getKeyCode() == KeyEvent.VK_UP )
        {
            ny = ny + 20;
            player = new ImageIcon("KD//KDN.png").getImage();
        }
        if( e.getKeyCode() == KeyEvent.VK_DOWN )
        {
            ny = ny - 20;
            player = new ImageIcon("KD//KDS.png").getImage();
        }

        repaint();
    }

    public void keyReleased(KeyEvent e)
    {

    }

    public void keyTyped(KeyEvent e)
    {

    }

}

问题是,当我在小程序屏幕上移动我的车时,它会闪烁。 对此有什么解决方案吗? 如何使其无闪烁屏幕。 我搜索了大多数网站,但他们展示的方式并没有那么多

thnx提前帮助

2 个答案:

答案 0 :(得分:5)

您应该在开始时加载所有图像,而不是在每次需要时实例化它们。

答案 1 :(得分:1)

除了您在KeyEvents上加载图片这一事实外,您还会覆盖paint,而paint没有利用Swing优化的双缓冲绘制机制。覆盖paintComponent而不是JComponent会导致闪烁。

将您的绘画功能移动到新的类子类paintComponent并覆盖paint而不是super.paintComponent(g)记住调用public class ImageComponent extends JComponent { private Image player; private Image backgroundImage; // formerly bg private int nx = 800; private int ny = 0; private Rectangle rect; @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.green); g.fillRect(0, 0, 34567, 34567); g.drawImage(backgroundImage, nx - 800, ny, null); g.drawImage(player, rect.x, rect.y, null); } public void setPlayer(Image player) { this.player = player; } public void setBackgroundImage(Image backgroundImage) { this.backgroundImage = backgroundImage; } }

KeyStrokes

不相关,但考虑使用Key Bindings而非KeyListeners处理与{{1}}的交互