Как перестать мерцать в этом коде
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)
{
}
}
Проблема в том, что когда я двигаю машину на экране апплета, она мерцает. Есть ли решение для этого. Как я могу сделать это без мерцания экрана. Я искал на большинстве сайтов, но, как они показали, это не сработало
Спасибо за помощь заранее
2 ответа
Вы должны загружать все свои изображения в начале, а не создавать их каждый раз, когда они вам нужны.
Помимо того, что вы загружаете изображения на KeyEvents
переопределяешь paint
который не использует преимущества оптимизированного механизма рисования двойной буферизации Swing. Переопределение paint
скорее, чем 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;
}
}
Не связано, но рассмотрите возможность использования Key Bindings, а KeyListeners обрабатывает взаимодействие с KeyStrokes