Ошибка при компиляции 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();
}
}
}
}