2つの変更をします。
1.一つ前の円を消して軌跡を残さない
2.右端までいったら左へ進むようにし、左端へいったら右へ進むようにする

MoveDisk2.javaをもとに、スレッドを使う MoveDisk の部分だけ変わります。
class MoveDisk extends Thread {
int x;
int y;
int d, dx;
int xmax, ymax;
Graphics2D thg;
MyPanel mypnl;
BufferedImage buffimg;
public MoveDisk(MyPanel mypnl) {
this.mypnl = mypnl;
this.buffimg = mypnl.buffimg;
thg = buffimg.createGraphics();
thg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
xmax = buffimg.getWidth();
ymax = buffimg.getHeight();
x = xmax/4; //100
y = (int)(ymax*Math.random());
d = xmax/40; //円の大きさ 10
dx = xmax/40; //動きの大きさ 10
}
@Override
public void run() {
//thg.setColor(Color.red);
while ( true ){
thg.setColor(mypnl.bgcolor);
thg.fillOval(x-d/2,y-d/2,d,d);
x+=dx;
if (x >xmax){
x = 2*xmax-x;
dx = -dx;
}
if (0 > x){
x = -x;
dx = -dx;
}
thg.setColor(Color.red);
thg.fillOval(x-d/2,y-d/2,d,d);
mypnl.repaint();
//100ms(0.1秒)停止
try {
Thread.sleep(100);
}
catch(InterruptedException ex) {
System.err.println(ex);
}
}
}
} //end of MoveDisk
強調部分が主要な変更です。
次の円を描くまえにそれを背景色で塗りつぶしてから x を dx だけ増やして新しく円を描きます。
RenderingHintで境界をぼかしているため、完全に消えずに残ってしまっていますが、消して描いているという説明には好都合なのでそのままにしています。

画面から出てしまうような x になったら、dx の正負を変えています。これが跳ね返ったということになります。

やはり複数の●を動かせますし、green, blue の残りのボタンも生きています。

左右で跳ね返ることを確認しなさい。
消した後を残さないようにするにはどうすればいいでしょうか。改良してみましょう。