Vinod Bhosale
Vinod Bhosale

Reputation: 23

How to stop flickering in this code

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)
    {

    }

}

The problem is when I move my car on the applet screen it flickers. Is there any solution to this. How can I make it Flicker free screen. I have searched on most of the sites but the way they showed it didn't worked that much

thnx for help in advance

Upvotes: 1

Views: 368

Answers (2)

Arnaud Denoyelle
Arnaud Denoyelle

Reputation: 31225

You should load all your images at the begining instead of instantiating them every time you need them.

Upvotes: 5

Reimeus
Reimeus

Reputation: 159754

Apart from the fact that you're loading images on KeyEvents, you're overriding paint which does not take advantage of Swing's optimized double buffering paint mechanism. Overriding paint rather than paintComponent causes flickering.

Move your paint functionality to a a new class subclassing JComponent and override paintComponent rather than paint remembering to invoke 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;
    }
}

Not related but consider using Key Bindings rather KeyListeners handling interaction with KeyStrokes

Upvotes: 1

Related Questions