【问题标题】:java double buffering moving an object with keysjava双缓冲用键移动对象
【发布时间】:2016-08-08 09:53:07
【问题描述】:

我想看懂这段代码

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);
}

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

【问题讨论】:

    标签: java swing paintcomponent double-buffering


    【解决方案1】:

    但我不明白它是如何工作的

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

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

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

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

    【讨论】:

    • 感谢您的回答,我将研究这些主题。但如果我不使用重绘方法,那么屏幕上没有任何变化。这就是我使用重绘方法的原因。
    • @AnılKırıkkaya,再一次永远不要在绘画方法中使用 repaint() !!!!更改组件的属性时使用 repaint()。那是当您更改在组件上调用 repaint() 的 x/y 变量时。在我给您的示例中,逻辑调用setLocation() 方法来更改组件的位置。 setLocation() 方法调用 reapaint() 方法。
    猜你喜欢
    • 1970-01-01
    • 2019-01-01
    • 2011-08-20
    • 1970-01-01
    • 2012-03-22
    • 2011-01-05
    • 2013-08-07
    • 2011-02-20
    相关资源
    最近更新 更多