I think I see your problem. Unless you tell them to do otherwise, mx:Validators will automatically validate whenever the 'trigger' even is dispatched on the target component that source is bound to. Since you didn't specify a triggerEvent the validators are listening for the default event ( which for a TextInput is 'valueCommit' if memory serves) and validating that field every time that event is seen. In your case, I think the culprit is that call to 'clearFields()'. That method is changing the text in the fields and thus causing the validation to run again on the now empty (and therefore invalid) TextInputs.
The simplest solution if you want your validation to only be triggered manually is to set the 'triggerEvent' property of your validators to an empty string. That will prevent them from firing automatically when the text changes.
cheers bro, I actually want the thing to validate as they enter text or click the button, but not when they clear the fields, is this possible?
It's actually pretty simple. Instead of setting triggerEvent to an empty string (which removes the listener) set it to the name of some other event you want to listen for. In this case I think you want to use the 'change' event since it only gets dispatched when the user actually interacts with the control.
Also check out the adobe docs here: http://help.adobe.com/en_US/Flex/4.0/UsingSDK/WS2db454920e96a9e51e63e3d11c0bf60efb-7fdd.ht ml#WS2db454920e96a9e51e63e3d11c0bf69084-7f4b for more info.