哪个语句清除以前的图形并在Java中绘制新图形?

哪个语句清除以前的图形并在Java中绘制新图形?,java,swing,graphics,awt,Java,Swing,Graphics,Awt,代码如下: public void paint(Graphics g) { g.fillOval(x, y, 25, 25); repaint(); } 这将创建一个这样的输出,如果我移动指针,它不会清除前面的图形并创建一个路径 通过像这样添加super语句,它不会显示路径,只显示椭圆图形的当前位置 public void paint(Graphics g) { super.paint(g); g.fillOval(x, y, 25, 25);

代码如下:

public void paint(Graphics g) {
    g.fillOval(x, y, 25, 25);

    repaint();

}
这将创建一个这样的输出,如果我移动指针,它不会清除前面的图形并创建一个路径

通过像这样添加super语句,它不会显示路径,只显示椭圆图形的当前位置

public void paint(Graphics g) {
    super.paint(g);
    g.fillOval(x, y, 25, 25);

    repaint();

}


我只想了解这背后的机制和原因。

对不起,您的代码有太多错误,我们必须修复它:

  • 首先,不要重写JComponent(或JFrame)的paint方法,而是重写JComponent或JPanel的paintComponent。这样可以避免错误地混淆边框或子组件的绘制,而这两者都是由绘制造成的。此外,由于paintComponent具有自动双缓冲功能,因此动画将更加平滑
  • 接下来,您几乎总是希望调用super的绘制方法,对于paintComponent,该方法是
    super.paintComponent(g)
    ,因为这将继续传播绘制链,而不调用它则会破坏该链。调用super的方法将调用组件的内务处理绘制,包括“脏”像素的过度绘制,这就是轨迹被删除的原因。这很可能是您正在寻找的答案
  • 最重要的是,不要在任何绘制方法中调用
    repaint()
    。这样做会产生一个完全无法控制的穷人动画,并将太多的责任放在绘画方法上,而绘画方法应该专注于其唯一的工作——绘制组件。使用一个游戏循环,比如摆动计时器
最重要的是——请阅读教程,因为其中已经解释了大部分内容:

  • :Swing图形的入门教程
  • :Swing图形高级教程

    • 很抱歉,您的代码有太多错误,我们必须修复它:

      • 首先,不要重写JComponent(或JFrame)的paint方法,而是重写JComponent或JPanel的paintComponent。这样可以避免错误地混淆边框或子组件的绘制,而这两者都是由绘制造成的。此外,由于paintComponent具有自动双缓冲功能,因此动画将更加平滑
      • 接下来,您几乎总是希望调用super的绘制方法,对于paintComponent,该方法是
        super.paintComponent(g)
        ,因为这将继续传播绘制链,而不调用它则会破坏该链。调用super的方法将调用组件的内务处理绘制,包括“脏”像素的过度绘制,这就是轨迹被删除的原因。这很可能是您正在寻找的答案
      • 最重要的是,不要在任何绘制方法中调用
        repaint()
        。这样做会产生一个完全无法控制的穷人动画,并将太多的责任放在绘画方法上,而绘画方法应该专注于其唯一的工作——绘制组件。使用一个游戏循环,比如摆动计时器
      最重要的是——请阅读教程,因为其中已经解释了大部分内容:

      • :Swing图形的入门教程
      • :Swing图形高级教程
      直接从

      公共空间涂料(图g)

      油漆容器。这会将油漆转发给任何轻质材料 作为此容器子级的组件。如果这个方法是 重新实现的super.paint(g)应该被称为 组件被正确渲染。如果子组件完全是 由g中的当前剪裁设置剪裁,将不显示paint() 转交给那个孩子

      正如他所说,super.paint()可以清除脏像素。这说明了一切。!!:)

      直接从

      公共空间涂料(图g)

      油漆容器。这会将油漆转发给任何轻质材料 作为此容器子级的组件。如果这个方法是 重新实现的super.paint(g)应该被称为 组件被正确渲染。如果子组件完全是 由g中的当前剪裁设置剪裁,将不显示paint() 转交给那个孩子


      正如他所说,super.paint()可以清除脏像素。这说明了一切。!!:)

      你能解释一下为什么会发生,为什么不会发生第二次吗。我是新来的,所以你能少一点吗technical@TusharSharma我已经做了。super的方法清除“脏”像素——参见上面的第2点。非常感谢:)现在我知道我可以深入研究了。你能解释为什么会发生,为什么不会发生第二次。我是新来的,所以你能少一点吗technical@TusharSharma我已经做了。super的方法清除“脏”像素——参见上面的第2点。非常感谢:)现在我知道我可以潜水更深,但如果我们使用双缓冲区而不使用super.paint();它也起作用。为什么?在双缓冲中,不是逐个绘制对象,而是在图像上绘制对象,然后告诉渲染器绘制整个图像;它也起作用。为什么?在双缓冲中,不是逐个绘制对象,在图像上绘制它们,然后告诉渲染器绘制整个图像。为什么不尝试将以前绘制的对象颜色填充为背景色。希望这可能有助于解决您的问题。为什么不尝试将以前绘制的对象颜色填充为背景色。希望这可能有助于解决您的问题。