我的问题是球一旦移动就会变成一条线。
这是代码:
package Java;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class javagame extends JFrame {
private Image dbImage;
private Graphics dbg;
int x, y;
public class AL extends KeyAdapter {
public void keyPressed (KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == e.VK_LEFT) {
x-= 5;
}
if(keyCode == e.VK_RIGHT) {
x+= 5;
}
if(keyCode == e.VK_UP) {
y-= 5;
}
if(keyCode == e.VK_DOWN) {
y+= 5;
}
}
public void keyReleased (KeyEvent e) {
}
}
public javagame() {
addKeyListener(new AL());
setTitle("Java Game");
setSize(750, 750);
setResizable(false);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
x = 250;
y = 250;
}
public void paint(Graphics g) {
dbImage = createImage(getWidth(), getHeight());
dbg = dbImage.getGraphics();
paintCompenent(dbg);
g.drawImage(dbImage, 0, 0, this);
}
public void paintComponent (Graphics g){
g.drawString("Copy Right All rights reserved to Aaron Collins 2013-2013", 275, 100);
g.drawLine(270, 105, 415, 105);
g.fillOval(x, y, 15, 15);
repaint();
}
public static void main(String[] args) {
new javagame();
}
}
当我说它变成一条线时,我的意思是球移动但不会移除前一个球。
请帮助我解决问题,以便我可以继续我的游戏!
最佳答案
- 您重写
paint
,但从不调用super.paint
,这意味着该组件永远不会为新的绘制周期准备图形上下文,这意味着您之前绘制的内容仍然存在 - 您的
paintComponent
方法永远不会被调用,因为JFrame
不支持此方法 - 您不应该在顶级容器(例如
JFrame
)上执行自定义绘制,而应该使用JPanel
之类的东西并覆盖它的paintComponent
方法(确保首先调用super.paintComponent
)。 - 您还应该避免在您要重写的任何
paintXxx
方法中调用任何可能触发重绘的方法...例如repaint
Graphics
上下文是共享资源,这意味着您所获得的Graphics
上下文已用于在您之前绘制 UI 中的所有其他组件。 paintComponent
负责通过清除要绘制的区域来准备用于绘制的 Graphics
上下文。
我建议您仔细阅读Custom Painting
我还会避免 KeyListener
并使用 Key Bindings API相反。
关于Java球移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17158476/