2〜3行目
AWTパッケージとAWT.EVENTパッケージのimport。
4行目
Swingパッケージのimport。 JPanel(32行目) と JFrame(92行目)で参照。
5行目
Utilパッケージのimport。 Randamメソッド(56行目と80〜86行目)を参照。
7〜30行目
Ballクラスの定義。
ボールの位置、単位時間あたりの移動方向と移動ドット数、色と大きさを保持する。 メソッド move は、単位時間経過後のボールの位置を計算し、更新する。
8行目
ボールの位置を示すx座標とy座標。
9行目
ボールの直径を保持。
10行目
ボールの移動速度。1回描画するごとに、x方向にdxドット、 y方向にdyドット移動する。 符号も意味があり、dxが正であれば右へ、負であれば左へ、 dyが正であれば下へ、負であれば上へ移動する。
11行目
ボールの色を保存。
13〜20行目
Ballクラスのコンストラクタ。
ボールの最初の位置のx座標、y座標、ボールの大きさ、 x方向とy方向の移動速度、ボールの色の6個のパラメータを 受け取り、各々クラス変数に保存する。
22〜29行目
ボールの移動後の座標の計算。
ボールの移動可能な範囲の左端、右端、上端、下端の4個の パラメータを受け取り、クラス変数y、およびxを更新する。
また、移動可能な範囲を超えた場合(縁にぶつかった場合)、 ボールの移動方向を反転させる。
23行目
ボールが下側の縁を越えて下に移動しようとしている場合、 dyの符号を反転する。
24行目
ボールが上側の縁を越えて上に移動しようとしている場合、 dyの符号を反転する。
25行目
ボールのy座標をdyだけ移動。
26行目
ボールが右側の縁を越えて右に移動しようとしている場合、 dxの符号を反転する。
27行目
ボールが左側の縁を越えて左に移動しようとしている場合、 dxの符号を反転する。
25行目
ボールのx座標をdxだけ移動。
32〜102行目
BallPanel クラスの定義。

Swing の JPanel クラスを継承し、 表示処理をマルチスレッド化するために、Runnable インターフェースを 実装する。

パネルを表示するための情報を保持し、パネルの描画をおこなう。

33行目
パネルの大きさ。縦、横とも300ドットとする。 プログラム内では変更できない(final)。
34行目
パネルの縁の厚さ。
35〜38行目
ボールの色を決めるための Color インスタンスの配列。
39行目
表示用のスレッドの保存用。
40行目
パネルの幅と高さを保持。
41行目
ボールの個数を保持。
42行目
個々のボールのインスタンスを保持。最大40個のボール。
43行目
Random クラスの変数。乱数を順次発生させるための変数。
45〜60行目
BallPanel クラスのコンストラクタ。 ボールの個数をパラメータで受け取り、パネルの色、縁の色、 パネルの大きさの設定、ボールの生成等を行う。
46〜47行目
パラメータで与えられたボールの個数が40を超えていれば40を、 超えていなければ、その個数を num に設定。
48行目
パネルの背景色を白に設定。
49行目
パネルの表示色を赤に設定。(これは不要でした)
50行目
パネルの縁の幅と、色を設定。
Swingではコンポーネントの縁取りを行うために、 BorderFactory クラス が用意されています。
51〜52行目
パネルの最小サイズと希望サイズを指定。
53〜54行目
パネルの幅と高さを、クラス変数に保持。
56行目
乱数を発生させるための Random インスタンスを生成。
80〜86行目の myRandom メソッドで参照。
57〜59行目
num 個の Ball インスタンスを生成。
62〜69行目
このパネルの描画のためのコールバック・ルーチン。
63行目
パネル自体の描画。
64〜68行目
ボールについての繰り返し。
65行目
ボールの移動可能範囲を指定して、Ball クラスの move メソッドを参照。
66行目
描画色の設定。ボールに保持されている色を、 今後の描画(67行目のfillOval)で使用するように指定。
67行目
楕円領域を描画色で塗りつぶす。ここでは、半径 d の円領域。
71〜78行目
ここが、マルチスレッドで実行される。
73〜75行目
25ミリ秒、実行を中断。
76行目
パネルの再描画。 repaint() を呼び出すと、パネル全体を背景色 で塗りつぶした後、62行目の paintComponent() メソッドがコール・バック されてくる。 swing の JPanel を継承しているので、 paint でなく paintComponent を準備した。
80〜81行目

乱数の発生。nextInt()は、int型の乱数を順次発生させる。 nextInt(6)とすると、0〜5の乱数が得られる。 また、nextDouble() とすると、0 〜 1.0 の一様乱数が得られる。

乱数はこの例のように、random メソッドを呼び出して、 乱数のシード(発生させる仕組みや、最初の乱数のもとになる値)を作成し、 その後 next... メソッドを繰り返し呼び出して、乱数を次々と手に入れます。 最初の乱数のもとになる値が等しければ、おなじ数列が得られます。 このような乱数を「擬似乱数」とよびます。
このプログラムのように、パラメタなしで random メソッド を呼び出すと、 現在の時刻をもとにシードをつくるので、いつも違った乱数列が得られます。 逆に、いつも同一の数列を手に入れるために、 random メソッドにパラメタを 与えてシードを作成することもできます。

88〜101行目
メインメソッド。
89行目
ボールの個数を一時保存する int型のローカル変数。
90〜91行目
DOSコマンドのパラメータを解析し、ポールの個数を num に設定する。パラメータがない場合、10とする。
92行目
JPanelをのせるために、swingのJFrameを生成。
93行目
AWTのFrameを生成した際には、addWidowListener で フレームのクローズボタンを押された場合の処理を登録したが、 JFrame の場合には、setDefaultCloseOperation が用意 され、ここに書いたように指定すると、ウィンドウがクローズ されたとき、ウィンドウが非表示になるだけでなく、消滅する。
95行目
ボールの個数を指定して、BallPanel を生成。
45行目〜60行目までが実行される。
96行目
AWTのFrameには、直接コンポーネントを張付けたが、 JFrameの場合には、コンテントペインというものが、 フレームの上にかぶっていて、 そこに張付ける仕組みになっている。
97〜98行目
ウィンドウのサイズの調整と表示。
99行目
BallPanel クラスのスレッド化。
100行目
スレッドの実行開始。