TextField Document model

Scott Palmer swpalmer at gmail.com
Wed Oct 17 14:05:13 PDT 2012


Using the override mechanism that Will suggested is probably easier for converting to uppercase.

final TextField allCapsTextField = new TextField() {
	@Override
	public void replaceText(int start, int end, String text) {
		super.replaceText(start, end, text.toUppercase());
	}
	@Override
	public void replaceSelection(String text) {
		super.replaceSelection(text.toUppercase());
	}
};

or you could still use the Event Filter and handle the insertion of the characters manually if they are lowercase
and then consume the event.  I think that will be more work and be more error-prone though.  As you mention you would have to handle pasting and drag and drop and all ugly details.  Overriding seems cleaner.

Perhaps you should take a look at the source code to TextInputControl.  Instead of the Document they have a Content interface.  Maybe you can do some of what you want by overriding getContent().

Scott

On 2012-10-17, at 4:41 PM, Mark Claassen <markclaassenx at gmail.com> wrote:

> Thanks for the tips.  The overriding method does not seem very pluggable,
> so I started with the event filter.
> 
> I like the idea of an event filter, and I really like the how JavaFX
> defined the process and the order in which items will receive events.
> 
> So, I quickly implemented my event filter like this:
>        input.addEventFilter(KeyEvent.
> KEY_TYPED, new EventHandler<KeyEvent>() {
>            @Override
>            public void handle(KeyEvent t) {
>                if (input.getText().length() >=10)
>                    t.consume();
>            }
>        });
> 
> This works for typing, but, of course, I can paste whatever I wanted.
> (Perhaps I need to find a second filter for that?  How about DnD?)
> 
> All input events go through the Swing Document, so with that, there was
> just one method to mess with.
> 
> Further, I currently have a Document implementation that takes user input
> and converts it to upper case.  (It doesn't force the user to type in an
> upper case character, it just converts it if it is not.)  Since, in the
> case of a Document, I can control exactly what the data is, this is pretty
> straightforward.  How is that accomplished here?  Consume the event, and
> then first a new modified copy of the original.  Or do I need to start
> overriding various methods?
> 
> 
> On Wed, Oct 17, 2012 at 4:40 PM, Mark Claassen <markclaassenx at gmail.com>wrote:
> 
>> Thanks for the tips.  The overriding method does not seem very pluggable,
>> so I started with the event filter.
>> 
>> I like the idea of an event filter, and I really like the how JavaFX
>> defined the process and the order in which items will receive events.
>> 
>> So, I quickly implemented my event filter like this:
>>        input.addEventFilter(KeyEvent.KEY_TYPED, new
>> EventHandler<KeyEvent>() {
>>            @Override
>>            public void handle(KeyEvent t) {
>>                if (input.getText().length() >=10)
>>                    t.consume();
>>            }
>>        });
>> 
>> This works for typing, but, of course, I can paste whatever I wanted.
>> (Perhaps I need to find a second filter for that?  How about DnD?)
>> 
>> All input events go through the Swing Document, so with that, there was
>> just one method to mess with.
>> 
>> Further, I currently have a Document implementation that takes user input
>> and converts it to upper case.  (It doesn't force the user to type in an
>> upper case character, it just converts it if it is not.)  Since, in the
>> case of a Document, I can control exactly what the data is, this is pretty
>> straightforward.  How is that accomplished here?  Consume the event, and
>> then first a new modified copy of the original.  Or do I need to start
>> overriding various methods?
>> 
>> Mark
>> 
>> 
>> 
>> 
>> 
>> 
>> On Wed, Oct 17, 2012 at 2:13 PM, Will Hoover <java.whoover at gmail.com>wrote:
>> 
>>> Have you tried:
>>> 
>>> final TextField tf = new TextField() {
>>>        final String restictTo = "[A-Z\\s]*";
>>>        @Override
>>>        public void replaceText(int start, int end, String text) {
>>>                if (matchTest(text)) {
>>>                        super.replaceText(start, end, text);
>>>                }
>>>        }
>>>        @Override
>>>        public void replaceSelection(String text) {
>>>                if (matchTest(text)) {
>>>                        super.replaceSelection(text);
>>>                }
>>>        }
>>>        private boolean matchTest(String text) {
>>>                return text.isEmpty() || text.matches(restictTo);
>>>        }
>>> };
>>> 
>>> -----Original Message-----
>>> From: openjfx-dev-bounces at openjdk.java.net
>>> [mailto:openjfx-dev-bounces at openjdk.java.net] On Behalf Of Mark Claassen
>>> Sent: Wednesday, October 17, 2012 1:08 PM
>>> To: openjfx-dev at openjdk.java.net
>>> Subject: TextField Document model
>>> 
>>> JTextComponents (like JTextField) has a javax.swing.text.Document model
>>> that
>>> made it pretty easy to create a text field that only allowed a certain
>>> number of characters in it.  Similarly, it was also easy to make a
>>> Document
>>> model that took all input, but forced characters to upper case.
>>> 
>>> @Override
>>> public void insertString(int offs, String str, AttributeSet a) throws
>>> BadLocationException {
>>>     <Do stuff>
>>> }
>>> 
>>> What is there going to be in JavaFX to accomplish the same goals?
>>> 
>>> Mark
>>> 
>>> 
>> 



More information about the openjfx-dev mailing list