gpt4 book ai didi

java - 小程序闪烁

转载 作者:行者123 更新时间:2023-12-01 12:50:13 25 4
gpt4 key购买 nike

我知道很多人都遇到了和我一样的问题,但我似乎无法通过他们的解决方案来修复我的小程序。我可能应该使用 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) {

}

}

最佳答案

您的主要问题在这里......

@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 组件默认情况下是双缓冲的,因此您不需要遇到额外的麻烦...除非您真的非常想要

然后,您可以将其添加到您喜欢的任何顶级容器JFrameJWindowJDialogJApplet

看看Performing Custom Painting了解更多详情

关于java - 小程序闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24278811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com