Hm, that's well said. Let's see....
Note that any explanation I give for doing this as an FPS-based thing will be purely post-action rationalization on my part since I just kind of wrote this the only way I could think of doing it. It's more of a lack of knowledge on my part than an attempt to do things a particular way. :-)
Anyhow, yup, let's see, how to do this without a busy-wait game loop? OK, there could be a timer that fires once a second that kicks off a "piece lower" event that erases and redraws that piece. And the KeyListeners could do a similar thing for rotation and left/right movement.
The animation thing would be interesting.
OK, it was interesting enough that I cobbled together an little "animation" that, in addition to be disconcertingly ugly, gives us something to work with. I've uploaded a new version to the web site - http://infoether.com/~tom/games/tetris/
So, how could I do something like that without a FPS thing? Maybe run the animation in another thread? And then interrupt the thread if the animation needed to be restarted? Maybe that's a way to do it...