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提前帮助
答案 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}}的交互