On 23/06/16 07:39, Tassilo Horn wrote:
> Nigel Wade <
n...@ion.le.ac.uk> writes:
>
> Hi Nigel,
>
>> The first thing I'd suggest is to think about the problem from the
>> user's perspective rather than the programmer's.
>>
>> If I, as a user, enter a number into a text field and inadvertently
>> enter an invalid character, I'd be rather annoyed if the GUI element
>> wiped out what I'd entered and replaced it with something which I
>> didn't want. It would be better from my (user) perspective if the
>> text element warned me of my transgression (flash, highlight, red
>> background whatever) and left my text there for me to edit, rather
>> than make me enter it again with the likelihood of making a similar
>> mistake again.
>
> Oh, flashing is actually a nice idea and can be done pretty easily from
> my listener.
A single flash. Not flashing.
>
>> Imagine if the current contents were 002324561234, and I wanted to
>> change it to 002324560234 but instead changed it to 00232456O234. Your
>> current method would revert it back to 002324561234, and I may never
>> notice that my change had been overridden.
>
> Well, in the concrete case the number is the maximum number of matches
> to be looked for in a database, so the numbers aren't that hard to
> distinguish but I got your point.
It's about least surprise (and annoyance) for the user.
>
>> What's wrong with parsing the entered text and, if there is an
>> exception, catch it and display some feedback, leaving the focus on
>> the text field? If you really, really want to set the text back to the
>> original value you could still do that in the catch block. I don't see
>> any benefit from using a ChangeListener.
>
> The problem is that I have no control over when and where the string in
> the text field is parsed and converted to a number. I just specified a
> declarative binding between the text field's text property and an
> integer property with a standart converter and thereby gave up exact
> control over these things. But bindings are such an integral part of FX
> that I guessed there must be some standart way to treat invalid input so
> that the binding's converter doesn't err.
>
I don't understand what implications there are with JavaFX. A normal scenario with Java/Swing is to either check the
user input when the field loses focus, is committed by key press (Return) or when the user indicates via some GUI
element that the input is complete. In Swing you do this by adding listeners to the components which get notified when
certain actions occur. To validate the field you would simply read the text from it and process it in whatever way you
see fit. You are in full control of how and when that text is checked and how it is interpreted. You may delegate to
some extent by using a JFormattedTextField, but as you are discovering that is not always the best option since you are
no longer in control of when/how the field contents are interpreted. Maintaining full control is often the only option.