Java JPanel移动节点位置-重新绘制不工作
当我按下箭头键并移动球时,Java JPanel移动节点位置-重新绘制不工作,java,swing,jpanel,Java,Swing,Jpanel,当我按下箭头键并移动球时,repaint()方法为什么不从以前删除球的位置?它创造了一个尾巴 谢谢你忘记给super的paintComponent打电话了。i、 e public void paintComponent(Graphics g) { g.setColor(Color.red); g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight()); } pub
repaint()
方法为什么不从以前删除球的位置?它创造了一个尾巴
谢谢你忘记给super的paintComponent打电话了。i、 e
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();
}
注
- 该组件应该受到保护,而不是公开的。另外,不要忘记
注释@Override
- Swing应用程序应避免使用KeyListener。键绑定通常是首选的,因为它们是“更高级别”的概念
- 因为你打破了油漆链
paintComponent
所做的一项工作是清除Graphics
上下文中以前绘制的内容
确保先调用super.paintComponent
通常,图形
上下文是一个共享资源,这意味着在绘制周期中绘制的所有内容都将共享相同的图形
上下文。这也意味着同一个图形上下文可能会用于单个本地对等方(就像您的情况一样)。您必须始终尽最大努力在使用前清理上下文(透明度是一种特殊情况)
查看更多关于如何在Swing中进行绘制的详细信息
正如已经提出的,建议您使用overkeystener
,最重要的原因是,键绑定API使您能够更好地控制触发键事件之前所需的焦点级别您忘记调用super.paintComponent(g)。看看
试着替换
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(ball.getX(), ball.getY(), ball.getWidth(), ball.getHeight());
}
借
您应该调用super.paintComponent(g)
并在keylisteners@growler查看更多关于如何在Swing+1中绘制的详细信息好的建议,与此问题无关,但应使用KeyBinding
而不是keylister
,因为现在他必须把面板调焦,然后进入focus@MadProgrammer:否,不要删除您的答案,因为它提供了不同的信息。我1+'d它是真的,这也是一个很好的答案。。。油漆组件链是一个很好的xD
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());
}