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
我也是,你甚至不应该担心它在做什么,因为该代码是完全错误的,不应该使用,原因如下:
- 你永远不会直接调用 paintComponent()
- 你永远不会在绘画方法中调用 repaint() 。这将导致无限循环
- 自定义绘画仅通过覆盖
paintComponent()
方法来完成。您不需要重写 paint()。
阅读 Custom Painting 上 Swing 教程中的部分,了解有关如何完成绘画的解释和示例。
一旦您正确理解了绘画的基础知识,您就可以继续摆脱 KeyListener。相反,您应该使用 Key Bindings
。所有 Swing 组件都使用 Actions
和 Key Bindings
来处理来自用户的特定键盘输入。查看 Motion Using the Keyboard 了解更多信息和工作示例。
我想看懂这段代码
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
我也是,你甚至不应该担心它在做什么,因为该代码是完全错误的,不应该使用,原因如下:
- 你永远不会直接调用 paintComponent()
- 你永远不会在绘画方法中调用 repaint() 。这将导致无限循环
- 自定义绘画仅通过覆盖
paintComponent()
方法来完成。您不需要重写 paint()。
阅读 Custom Painting 上 Swing 教程中的部分,了解有关如何完成绘画的解释和示例。
一旦您正确理解了绘画的基础知识,您就可以继续摆脱 KeyListener。相反,您应该使用 Key Bindings
。所有 Swing 组件都使用 Actions
和 Key Bindings
来处理来自用户的特定键盘输入。查看 Motion Using the Keyboard 了解更多信息和工作示例。