TextField Document model

Mark Claassen markclaassenx at gmail.com
Mon Nov 26 19:44:38 PST 2012

I sent a potential API change to Richard Bair a few weeks ago.  He has not
responded to me, which makes me think it was too complicated at this point
and wasn't going to fly.  I think for a good InputMaskField, the Content
and the eventual caret position and selection needs to be controlled by the
"model".  This makes the solution a bit complex.

However, for filtering, this is not the case.  Doing both of these in one
shot is, perhaps, a mistake.  Here is another idea which takes care of the
easy cases...easily.  A more complex InputMask control I will save for

So, here is the simplified idea:  Add the ability to "filter".  And by
filter, I mean the ability to modify the input and only the input:

Add the following sub-interface to the Content interface.  No methods are
added to the Content interface.
     interface Filter {
          String filter(int index, String text, String currentContent);

Add the following to TextFieldContent and TextAreaContent:
     private Content.Filter filter;
     public void setContentFilter(Content.Filter filter) {
          this.filter = filter;

Change the "insert" method of TextFieldContent and TextAreaContent to start
     @Override public void insert(int index, String text, boolean
notifyListeners) {
          text = TextInputControl.filterInput(text, [boolean], [boolean]);
          if (filter != null)
               text = filter.filter(index, text, get());

Add a method in TextField:
     public void setContentFilter(Content.Filter filter) {

Add a method in TextArea:
     public void setContentFilter(Content.Filter filter) {

This would do a few things:
1) Use the current "TextInputControl.filterInput" mechanisms of TextField
and TextArea (like to strip out special chars and newlines).
2) By specifying the Filter interface outside of TextField and TextArea, it
allows the same filter to be used for TextField and TextArea
3) Makes it simple to do things like translate all input to upper case or
limit the overall length
4) By not adding a method to Content directly, something like the
InputMaskContent would not be forced to deal with the Filter interface at

This implementation would allow someone creating a filter to "filter" the
text to have illegal characters.  I thought it was more validate this
first, so that the implementer would only have to deal with proper input.
However, TextInputControl.filterInput could be done both before and after
the Filter.filter() call.
          text = TextInputControl.filterInput(text, [boolean], [boolean]);
          if (filter != null) {
               text = filter.filter(index, text, get());
               text = TextInputControl.filterInput(text, [boolean],

Another possible addition to this may be to allow the filter to return
null, signifying an error input and causing the system to "beep".

Thanks for your consideration,

More information about the openjfx-dev mailing list