public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight());
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_DOWN) {
System.out.println("down");
ball.moveY(5);
}
if(keyCode == KeyEvent.VK_UP) {
System.out.println("up");
ball.moveY(-5);
}
if(keyCode == KeyEvent.VK_LEFT) {
System.out.println("left");
ball.moveX(-5);
}
if(keyCode == KeyEvent.VK_RIGHT) {
System.out.println("right");
ball.moveX(5);
}
System.out.println("X: " +ball.getX() +", Y: " +ball.getY());
repaint();
}
当我按箭头键并移动ball
时,为什么repaint()
方法不能从之前删除球的位置?它正在创造一个尾巴。
由于
答案 0 :(得分:4)
你忘了打电话给super的paintComponent。即,
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight());
}
注意
@Override
注释。答案 1 :(得分:4)
因为你已经打破了油漆链。
paintComponent
所做的工作之一就是清除以前曾为其绘制过的Graphics
背景。
请务必先致电super.paintComponent
通常,Graphics
上下文是共享资源,这意味着在绘制周期中绘制的所有内容都将共享相同的Graphics
上下文。这也意味着可能将相同的Graphics
上下文用于单个本地对等方(就像您的情况一样)。在使用之前,您必须尽最大努力清理上下文(透明度是一种特殊情况)
请查看Painting in AWT and Swing,了解有关如何在Swing中完成绘画的详细信息
正如已经建议的那样,建议您使用Key Bindings API而不是KeyListener
,最重要的原因是因为密钥绑定API可以让您更好地控制所需的焦点水平。关键事件被触发
答案 2 :(得分:0)
您忘记调用super.paintComponent(g)。看看PaintComponent
尝试替换
public void paintComponent(Graphics g) {
g.setColor(Color.red);
g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight());
}
通过
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight());
}