首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >小程序闪烁

小程序闪烁
EN

Stack Overflow用户
提问于 2014-06-18 14:50:49
回答 1查看 414关注 0票数 0

我知道很多人和我有同样的问题,但我似乎无法修复我的applet看着他们的解决方案。我可能应该使用JApplet,JFrames和JPanel来做这个项目,但我想先做一个使用Applet的项目,然后再使用Japplet(我想看看这两者之间的区别)。有没有人能看看我的画图方法,看看它为什么闪烁?似乎不能加倍缓冲它。

代码语言:javascript
运行
复制
    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) {

    }

}
EN

回答 1

Stack Overflow用户

发布于 2014-06-18 15:01:14

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

代码语言:javascript
运行
复制
@Override
public void update(Graphics g) {
    super.update(g);
}


@Override
public void paint(Graphics g) {
    g.drawImage(character, ninja.getCenterX(), ninja.getCenterY(), this);
}

Applet (和所有顶层容器)不是双缓冲的,这意味着您可以直接在屏幕设备上绘制。这些函数中的一些可能很慢(例如,泛洪填充),如果完成得足够快,可能会导致闪烁。

相反,您需要实现自己的双缓冲过程

代码语言:javascript
运行
复制
@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

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

有关更多详细信息,请查看Performing Custom Painting

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24278811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档