JPanel移动节点位置 - 重绘不工作

时间:2014-01-17 23:55:18

标签: java swing jpanel

enter image description here

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()方法不能从之前删除球的位置?它正在创造一个尾巴。

由于

3 个答案:

答案 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());
}

注意

  • paintComponent应该受到保护,而不是公共的。另外,请不要忘记@Override注释。
  • Swing应用程序应该避免使用KeyListeners。键绑定通常是首选,因为它们是“更高级别”的概念。

答案 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());
    }