Ошибка при компиляции error: cannot find symbol

При компиляции следующей программы выдается "ошибка 128: error: cannot find symbol canvas.repaint();" Вызов canvas.repaint() есть в двух местах, но компилятор ругается только на строку в game(). Если там удалить canvas.repaint(), программа компилируется без ошибок и запускается, но содержимое окна обновляется только при нажатии кнопки мыша.

Хотелось бы понять, почему нельзя вызвать canvas.repaint() в game()?

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Dimension;
import java.util.Random; // импорт класса Random
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;

public class RandomBalls extends JFrame {

    final String TITLE_OF_PROGRAM = "Random balls";
    final int WINDOW_WIDTH = 650;
    final int WINDOW_HEIGHT = 650;
    final int COUNT_BALLS = 30;
    
    Random random; // поле класса RandomBalls
        
    final Color[] COLORS = {Color.red, Color.green, Color.blue, Color.yellow};
    
    ArrayList<Ball> balls;
    
    public static void main(String[] args) {
        new RandomBalls().game();
    }
    
    public RandomBalls() {
        setTitle(TITLE_OF_PROGRAM);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        random = new Random(); // создание объекта в конструкторе
        Canvas canvas = new Canvas();
        canvas.setBackground(Color.white);
        canvas.setPreferredSize(
            new Dimension(WINDOW_WIDTH, WINDOW_HEIGHT));
        
        canvas.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                deleteBall(e.getX(), e.getY());
                canvas.repaint();        /*на эту строку компилятор не ругается*/    
            }
        });
        
        balls = new ArrayList<>();
        
        add(canvas);
        pack();
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    
        
    }
    
    class Canvas extends JPanel {
        @Override
        public void paint(Graphics g) {
             super.paint(g);
            // рисуем окружности
                for (Ball ball : balls) {
                ball.paint(g);
            } 
        } 
    }
    
    class Ball {
        int x, y, d;
        Color color;
        
        Ball(int x, int y, int d, Color color) {
            this.x = x;
            this.y = y;
            this.d = d;
            this.color = color;
        }
        
        void paint(Graphics g) {
            g.setColor(color);
            g.fillOval(x, y, d, d);
            g.setColor(Color.black);
            g.drawOval(x, y, d, d);
        }
    }
    
    void addBall() {
        int d = random.nextInt(20) + 60;
        int x = random.nextInt(WINDOW_WIDTH - d);
        int y = random.nextInt(WINDOW_HEIGHT - d);
        Color color = COLORS[random.nextInt(COLORS.length)];
        balls.add(new Ball(x, y, d, color));
    }
    
    void deleteBall(int x, int y) {
        for (int i = balls.size() - 1; i > -1; i--) {
            double dx = balls.get(i).x + balls.get(i).d/2 - x;
            double dy = balls.get(i).y + balls.get(i).d/2 - y;
            double d = Math.sqrt(dx * dx + dy * dy);
            if (d < balls.get(i).d/2) {
                balls.remove(i);
                break;
            }
        }
    }
    
    void game() {
            int showDelay = 1000;
            int counter = 0;
            while (true) {
                addBall();
                if (balls.size() >= 5) {
                    System.out.println("Игра окончена: " + counter);
                    break;
                }
                canvas.repaint();   /* компилятор ругается на эту строку */
                counter++;
                if (counter % 10 == 0 && showDelay > 100) {
                    showDelay -= 100;
                }
                try {
                    Thread.sleep(showDelay);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
}
    

Ответы (0 шт):