簡體   English   中英

小程序閃爍

[英]Applet flickering

我知道很多人都和我有同樣的問題,但是我似乎無法通過他們的解決方案來修復我的小程序。 我可能應該使用JApplet,JFrames和JPanel來執行此項目,但是在繼續使用Japplet之前,我想先使用Applet進行一個項目(我想看看兩者之間的區別)。 有人可以看看我的繪畫方法,看看為什么會閃爍嗎? 似乎無法加倍緩沖。

    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

請看表演自定義繪畫以了解更多詳細信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM