这是片段:
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();
}
}
答案 0 :(得分:5)
如果您想在Swing面板上使用动画,请使用Swing Timer。
你不应该使用while(true)循环,并且该代码绝对不应该是paintComponent()方法的一部分或直接调用paintComponent()方法。
在自定义面板中,您需要设置setOvalLocation(Point)等属性。然后当Timer触发时,你更新椭圆位置并在面板上调用repaint。
我建议您先阅读Custom Painting上的Swing教程,以获得更详细的解释和示例。
答案 1 :(得分:4)
您应该使用合格超级。
movingObjects.super.paintComponent(g);
因为,当您在内部类中使用this
或super
时(在本例中为Runnable
),您将获得内部类。如果要使用内部类中的外部类,请使用Qualified This或Qualified Super。
YourOuterClassName.this
YourOuterClassName.super
合格超级是我在JLS中找不到的术语,我自己发明了它。
答案 2 :(得分:3)
因为Runnable
没有paintComponent()
方法。这是使用匿名内部类的缺点之一,它使得很难看到当前上下文是什么,但在您的情况下,上下文是run()
方法,因此super
指的是超类您的匿名内部类,Runnable
。
如果要从内部类引用外部类的超类,则应使用movingObjects.super.paintComponent()