想使用java中的线程控制小球在格子移动

想使用java中的线程控制小球在格子中从左向右移动。但是线程的run()方法中却没有调用绘图方法repaint(),麻烦请问一下这个怎么解决?

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

import com.soft.Graphic.*;

public class TransportDemo extends Thread {

// 定义数组,一个数组元素对应一个格子
int a[] = new int[10];
// 设置变量,方便循环使用
 int j = 0;
 int jj = 0;
// 定义标志,用来控制格子中有几个点
int flag = 1;

// 实例化矩形和圆形类
Rectangles rect = new Rectangles();
Circle circle = new Circle();

// 定义窗口大小
private final int AREA_WIDTH = 340;
private final int AREA_HEIGHT = 240;

// 定义窗口
JFrame f = new JFrame("测试窗口");
// 定义画布大小
Grain gr = new Grain();

// 定义计时器
Timer timer;
Timer timer1;

public void init() {
    gr.setPreferredSize(new Dimension(AREA_WIDTH, AREA_HEIGHT));
    // 循环赋值个数组,1为占据,0为空

// for (int ii = 0; ii < flag; ii++) {
// a[ii] = 1;
// }

    f.add(gr);
    f.pack();
    f.setVisible(true);
}


//线程方法,设置数组中的位置值为0或者1。
public void run (){
    super.run();
    System.out.println("已经进入进程");
    while(true){
    if(j==0){
        a[0]=1;
        j+=1;
    }else if(j==a.length-1){
        a[j]=0;
        j=0;
    }else{
        a[j]=0;
        a[j+1]=0;
        j+=1;
    }
    gr.repaint();
    }
}



// 图像呈现面板
class Grain extends Canvas {
    @Override
    public void paint(Graphics g) {
        // 遍历数组,当数组的位置的值为1,则显示粒子
        System.out.println("调用了repaint函数");
        for (int i = 0; i < a.length; i++) {
            if (a[i] == 1) {
                g.setColor(Color.black);
                g.fillOval(i * 20 + circle.getBallX(), circle.getBallY(),20, 20);
            }
        }
        // 绘制网格
        rect.paint(g);
    }

}

public static void main(String[] args) {
    new TransportDemo().init();
    new TransportDemo().start();
}

}

你的System.out.println("已经进入进程");可以运行么?