ボールが残るのって、lock〜unlockやっているから
「ボールの大きさ」と「移動幅」の関係が合っていないのでは?
ボールがボールの上に上書きされるから、尻尾が付く感じになる。
移動幅をボールの大きさより大きくすると良い。

液晶って意外と反応遅いから、他の要素も描画したりキーイベントの
処理を行うとスレッド内部での処理が難しくなる。
ロジック上で排他処理を追加してみてはいかが?
例えば「イベント処理中は、描画スレッドの要求が来ても無視する」
とか、「カーネルを作って、きちんとしたイベント処理を作る」など。

>>393にも挙げておられますが、前の場所を消して次の場所に描画
した後"repaint"を呼ぶと良いですよ。
使えるか試した事無いけど、Windowsアプリの描画手段として
仮想画面(パネル)を作って描画を掛ける手法もあります。
描画前に仮想画面に描画を行い、描画イベントで仮想画面の描画
を行うといった内容です。
スプライトが使えれば、頼れば良い。
使えないならば、排他的論理和(Xor)を用いて同じ場所に同じ物を
出すと消える。 同じ方法を移動先で使うと現れる。
(どこかのサンプル・アプリ「インベーダー・ゲーム」で使っていた)