Problem with super.paintComponent (g)

This is a snippet:

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

When compiling the full code, the following error occurs:

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

Why am I getting this error?

If this is my full code:

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();
  }
 }  
+3
source share
3 answers

You must use a qualified super.

movingObjects.super.paintComponent(g);

Because when you use thisor superinside an inner class (in this case:) Runnable, you get an inner class. If you want to use an outer class from an inner class, use Qualified This or Qualified Super.

YourOuterClassName.this
YourOuterClassName.super

Qualified Super is a term that I cannot find in JLS, I coined it myself.

+4
source

Swing, Swing Timer.

while (true), paintComponent() paintComponent().

, setOvalLocation (Point). , , .

Swing Custom Painting .

+5

Runnable paintComponent(). , - , , - run(), super Runnable.

If you want to refer to the superclass of the outer class from the inner class, you should use movingObjects.super.paintComponent()

+3
source

All Articles