Reputation: 23
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
Reputation: 31225
You should load all your images at the begining instead of instantiating them every time you need them.
Upvotes: 5
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