problem with super.paintComponent(g)



这是一个片段:

protected void paintComponent(final Graphics g) {
 Runnable r=new Runnable() {
 @Override
  public void run() {
   while(true) {
     super.paintComponent(g);  // <----- line of error
     g.setColor(Color.red);
     g.drawOval(x,y,width,height);
     g.fillOval(x,y,width,height);
     x++;
     y++;
     width++;
     height++;
       if(width==20)
          break;
     try {
        Thread.sleep(100);
     } catch(Exception exc) {
         System.out.println(exc);
       }
   }
  }
};
 Thread moveIt=new Thread(r);
 moveIt.start();
}

当我编译完整的代码时,会产生以下错误:

d:UnderTest>javac mainClass.java
mainClass.java:18: cannot find symbol
     super.paintComponent(g);
          ^
symbol:   method paintComponent(Graphics)
location: class Object
1 error

为什么会出现此错误

如果这是我的完整代码:

import java.awt.*;
import javax.swing.*;
import java.lang.Thread;
class movingObjects extends JPanel {
int x=2,y=2,width=10,height=10;
@Override
protected void paintComponent(final Graphics g) {
Runnable r=new Runnable() {
 @Override
  public void run() {
   while(true) {
     super.paintComponent(g);
     g.setColor(Color.red);
     g.drawOval(x,y,width,height);
     g.fillOval(x,y,width,height);
     x++;
     y++;
     width++;
     height++;
       if(width==20)
          break;
     try {
        Thread.sleep(100);
     } catch(Exception exc) {
         System.out.println(exc);
       }
   }
  }
 };
   Thread moveIt=new Thread(r);
    moveIt.start();
    }
   }
class mainClass {
 mainClass() {
 buildGUI();
}
 public void buildGUI() {
 JFrame fr=new JFrame("Moving Objects");
 movingObjects mO=new movingObjects();
 fr.add(mO);
 fr.setVisible(true);
 fr.setSize(400,400); 
 fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
 public static void main(String args[]) {
  new mainClass();
  }
 }  

如果您想在Swing面板上制作动画,请使用Swing Timer。

您不应该使用while(true)循环,并且该代码绝对不应该是paintComponent()方法的一部分,也不应该直接调用paintComponents()方法。

在自定义面板中,需要设置诸如setOvalLocation(点)之类的特性。然后,当计时器触发时,您会更新椭圆位置并调用面板上的重新绘制。

我建议您先阅读关于自定义绘画的Swing教程,以获得更详细的解释和示例。

您应该使用Qualified Super。

movingObjects.super.paintComponent(g);

因为,当您在内部类(本例中为Runnable)中使用thissuper时,您将获得内部类。如果要从内部类使用外部类,请使用Qualified This或Qualified Super。

YourOuterClassName.this
YourOuterClassName.super

合格超级是我在JLS中找不到的一个术语,我自己发明的。

因为Runnable没有paintComponent()方法。这是使用匿名内部类的缺点之一,这使得很难看到当前上下文是什么,但在您的情况下,上下文是run()方法,因此super指的是匿名内部类中的超类,即Runnable

如果要从内部类引用外部类的超类,则应使用movingObjects.super.paintComponent()

相关内容

  • 没有找到相关文章

最新更新