First, you used setStyleName, not addStyleName. But both should work fine as we all make extensive use of them.
Check your browser page using whatever developer tools you have for markup/styles debugging. Be sure your CSS is being included in the page since by default your own CSS needs to be defined in a custom theme.
The .v-textfield-YOURNAME should work, too, since Vaadin will add just YOURNAME as well as the widget-specific version like you are using.
.v-textfield.v-textfield-mystyle.mystyle basically means a div class that has .v-textfield AND .v-textfield-mystyle AND .mystyle. It requires all three from it.
And the discussion about using addStyleName or setStyleName: Doesn’t matter the slightest if you only add one stylename. The difference between those two comes into play when you add the second stylename. add just adds it while set replaces the current one.
My guess why .mystyle{ } didn’t work directly is
CSS specificity . That means that if there is one CSS rule that is more specific than another, the more specific one will override the other one, no matter in which order they are specified. The vaadin theme has some predefined rules for textfield (to make it look like the basic textfield looks) which are more complex than only one css rule.This is why many also use the !important tag in the end of declaratations, which is in my opinion a very bad practice Something like .v-app .textfield or .textfield.mystyle might have worked. You can see in firebug which style override which by choosing the element and looking at the applied rules. The most important one is at the top.