Is the crux of your problem. You have to think about game programming in a fundamentally different way than other things. Yes, your character is moving one square at a time (and only in one direction, which is a separate bug), but you're not doing it over time.

There are many ways of solving this, but thinking about it in a threaded sense is the wrong way to do it.

In a very basic sense, you need to simulate all of your entities for a frame, draw that frame, then continue to update. That frame is usually somewhere in the range of 1/60th to 1/30th of a second. So if you want your guy to move at X pixels a second, for one "tick" or "frame", you move him that frame's portion. Usually game frameworks have some kind of "game loop" setup where the actual time it took to draw the frame is passed down as a "delta time" value that you use instead of hard coding a frame time.

So in a rough sense, you would have to have an update() method on your guy that represents a single frame's worth of movement, and you do that movement and only that movement. The "while" loop is contained elsewhere (as a trivial case, your "repaint" loop is what you could use).

Just look for documentation on "game loops" and that should point you in a better direction.