проблема с super.paintComponent (g) - PullRequest
3 голосов
/ 03 июня 2011

Это фрагмент:

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

Ответы [ 3 ]

5 голосов
/ 03 июня 2011

Если вы хотите анимацию на панели Swing, используйте Swing Timer .

Вы не должны использовать цикл while (true), и этот код определенно не должен быть частью метода paintComponent () или напрямую вызывать метод paintComponent ().

В вашей пользовательской панели вам нужно установить свойства, такие как setOvalLocation (Point). Затем при срабатывании таймера вы обновляете овальное местоположение и вызываете перерисовку на панели.

Я предлагаю вам начать с чтения учебника по Swing на Custom Painting для более подробного объяснения и примера.

4 голосов
/ 03 июня 2011

Вы должны использовать Qualified Super.

movingObjects.super.paintComponent(g);

Потому что, когда вы используете this или super внутри внутреннего класса (в данном случае: Runnable), вы получите внутренний класс,Если вы хотите использовать внешний класс из внутреннего класса, используйте Qualified This или Qualified Super.

YourOuterClassName.this
YourOuterClassName.super

Qualified Super - термин, который я не могу найти в JLSЯ сам придумал.

3 голосов
/ 03 июня 2011

Потому что Runnable не имеет paintComponent() метода. Это один из недостатков использования анонимных внутренних классов, он затрудняет просмотр текущего контекста, но в вашем случае контекст является методом run(), поэтому super относится к суперклассу вашего анонимного внутреннего класса. класс, который Runnable.

Если вы хотите сослаться на суперкласс внешнего класса из внутреннего класса, вы должны использовать movingObjects.super.paintComponent()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...