Hola:
Veo varios problemas en el código.
No debe llamarse nunca a paint() directamente. Si quieres que se repinten las ventanas, debe llamarse al método repaint(). Este método NO repinta la ventana en el momento, sino que encola la petición para más adelante, cuando java puede hacerlo. Por ello, cualquier código que haga cosas, llame a paint() o repaint() siga haciendo cosas, vuelva a llamar a paint() o repaint() y siga haciendo cosas, no tiene ninguna garantía de que se haga todo en orden. Los paint() o repaint() se ejecutan en un hilo separado, paralelo a tu código.
Si además, tu código se está ejecutando como consecuencia de un evento de teclado o ratón (un actionListener, keyListener o cualquier otro similar), el sleep() y tu codigo está bloqueando el hilo de pintado, por lo que todo lo que hagas NO se verá reflejado en las ventanas hasta que acabe tu codigo y entonces, se reflejará todo de golpe. Esto puede justificar que todos los eventos queden "encolados" y que no se deshabiliten los botones. Puedes ver todo esto algo más detallado en el
hilo de awt.
Para hacer esto bien, debes lanzar hilos o timers. Echa un ojo a
javax.swing.Timer.
Deberías pintar toda la ventana como la quieres y luego, para las cosas que deben suceder un tiempo después, lanzar un javax.swing.Timer y en el código de ese Timer, habilitar, poner gris o lo que quieras.
Se bueno.