java 双缓冲使用键移动对象

java double buffering moving an object with keys

我想看懂这段代码

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JFrame;

public class pinpon extends JFrame  {



private Image image;
    private Graphics graph;
    int x , y ;

    public class klavye extends KeyAdapter{
        public void keyPressed(KeyEvent e){
            int key = e.getKeyCode();
        if (key == e.VK_LEFT)
            x=x-5;      
        if (key == e.VK_RIGHT)  
            x=x+5;  
        if (key == e.VK_UP) 
            y=y-5;
        if (key == e.VK_DOWN)
            y=y+5;
        }
        public void keyReleased(KeyEvent e){    
        }

    }

    public pinpon(){
        addKeyListener(new klavye());

        setSize(640, 480);
        setResizable(false);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        x=150;
        y=150;
    }

    public void paint(Graphics g){
        image = createImage(getWidth(), getHeight());
        paintComponent(image.getGraphics());
        g.drawImage(image,0,0,this);

    }

    public void paintComponent(Graphics g){
        g.fillOval(x, y, 15, 15);
        repaint();
    }

    public static void main(String[] args) {
        new pinpon();
    }

}

但在这里我认为这段代码用于双缓冲

public void paint(Graphics g){
    image = createImage(getWidth(), getHeight());
    paintComponent(image.getGraphics());
    g.drawImage(image,0,0,this);
}

此代码用于移动球无任何痕迹。但我不明白它是如何工作的。有谁能够帮助我。或者告诉我在哪里可以找到任何解释。谢谢。

But i did not understand how is it works

我也是,你甚至不应该担心它在做什么,因为该代码是完全错误的,不应该使用,原因如下:

  1. 你永远不会直接调用 paintComponent()
  2. 你永远不会在绘画方法中调用 repaint() 。这将导致无限循环
  3. 自定义绘画仅通过覆盖 paintComponent() 方法来完成。您不需要重写 paint()。

阅读 Custom Painting 上 Swing 教程中的部分,了解有关如何完成绘画的解释和示例。

一旦您正确理解了绘画的基础知识,您就可以继续摆脱 KeyListener。相反,您应该使用 Key Bindings。所有 Swing 组件都使用 ActionsKey Bindings 来处理来自用户的特定键盘输入。查看 Motion Using the Keyboard 了解更多信息和工作示例。