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中进行绘制的详细信息


      正如已经提出的,建议您使用over
      keystener
      ,最重要的原因是,键绑定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());
          }