我知道很多人和我有同样的问题,但我似乎无法修复我的applet看着他们的解决方案。我可能应该使用JApplet,JFrames和JPanel来做这个项目,但我想先做一个使用Applet的项目,然后再使用Japplet(我想看看这两者之间的区别)。有没有人能看看我的画图方法,看看它为什么闪烁?似乎不能加倍缓冲它。
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
public class Main extends Applet implements Runnable, KeyListener {
private Ninja ninja;
private Image character;
private URL base;
@Override
public void init() {
setSize(800, 480);
setBackground(Color.WHITE);
setFocusable(true);
Frame frame = (Frame) this.getParent().getParent();
frame.setTitle("NinjaGirl");
addKeyListener(this);
try {
base = getDocumentBase();
} catch (Exception e) {
}
character = getImage(base, "data/FrontStanding.png");
super.init();
}
@Override
public void start() {
ninja = new Ninja();
Thread thread = new Thread(this);
thread.start();
super.start();
}
@Override
public void stop() {
super.stop();
}
@Override
public void destroy() {
super.destroy();
}
@Override
public void update(Graphics g) {
super.update(g);
}
@Override
public void paint(Graphics g) {
g.drawImage(character, ninja.getCenterX(), ninja.getCenterY(), this);
}
@Override
public void run() {
while (true) {
ninja.update();
repaint();
try {
Thread.sleep(17);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
ninja.moveUp();
System.out.println("Up key pressed");
break;
case KeyEvent.VK_DOWN:
ninja.moveDown();
break;
case KeyEvent.VK_RIGHT:
ninja.moveRight();
break;
case KeyEvent.VK_LEFT:
ninja.moveLeft();
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
ninja.stop();
break;
case KeyEvent.VK_DOWN:
ninja.stop();
break;
case KeyEvent.VK_RIGHT:
ninja.stop();
break;
case KeyEvent.VK_LEFT:
ninja.stop();
break;
}
}
@Override
public void keyTyped(KeyEvent arg0) {
}
}发布于 2014-06-18 15:01:14
你的主要问题在这里...
@Override
public void update(Graphics g) {
super.update(g);
}
@Override
public void paint(Graphics g) {
g.drawImage(character, ninja.getCenterX(), ninja.getCenterY(), this);
}Applet (和所有顶层容器)不是双缓冲的,这意味着您可以直接在屏幕设备上绘制。这些函数中的一些可能很慢(例如,泛洪填充),如果完成得足够快,可能会导致闪烁。
相反,您需要实现自己的双缓冲过程
@Override
public void update(Graphics g) {
GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(getWidth(), getHeight(), Transparency.OPAQUE);
Graphics2D g2d = image.getGraphics();
super.update(g2d);
g2d.dispose();
g.drawImage(image, 0, 0, this);
}
@Override
public void paint(Graphics g) {
g.drawImage(character, ninja.getCenterX(), ninja.getCenterY(), this);
}现在,话虽如此,Applet已经过时15年了,取而代之的是JApplet和Swing API。
相反,你应该开始在像JPanel这样的东西上创建你的UI,覆盖它的paintComponent方法,并在那里进行自定义绘制。
Swing组件在缺省情况下是双缓冲的,因此您不需要转到非常非常想要的额外trouble...unless
然后,您可以将其添加到您喜欢的任何顶级容器中:JFrame、JWindow、JDialog、JApplet
有关更多详细信息,请查看Performing Custom Painting
https://stackoverflow.com/questions/24278811
复制相似问题