On Thu, 28 May 2020 06:50:57 GMT, Robert Lichtenberger <[email protected]>
wrote:
>> Most of the time, value in
>> javafx.scene.control.TextInputControl.replaceText(int, int, String, int,
>> int) will already
>> be filtered (e.g. linebreaks in TextField) In that case, adjustmentAmount
>> will be zero and one could just do the
>> selection before actually inserting the text.
>> But a case can be constructed with a TextFormatter that will produce
>> characters that will be filtered by the TextField
>> itself:
>>
>> @Test public void replaceSelectionWithFilteredCharacters() {
>> txtField.setText("x xxxyyy");
>> txtField.selectRange(2, 5);
>> txtField.setTextFormatter(new TextFormatter<>(this::noDigits));
>> txtField.replaceSelection("a1234a");
>> assertEquals("x aayyy", txtField.getText());
>> assertEquals(4, txtField.getSelection().getStart());
>> assertEquals(4, txtField.getSelection().getStart());
>> }
>>
>> private Change noDigits(Change change) {
>> Change filtered = change.clone();
>> filtered.setText(change.getText().replaceAll("[0-9]","\n"));
>> return filtered;
>> }
>
> The last commit on this branch seems like the "best" way to fix this problem.
> It prevents in-between changes in
> selectedText and does not introduce (to the best of my knowledge) any new
> corner cases. It eliminiates the "root cause"
> of the problem by postponing selectedText update to the end of whole
> replace-operation. So, this is RFR now (I hope).
good direction, I think :)
Didn't look too closely, just added your changes and run the tests - getting a
StringIndexOutofBounds at
TextInputControlTest.test_jdk_8171229_replaceText(TextInputControlTest.java:1862)
(no failing test because the
uncaughtException handler not redirected). Could you check please?
-------------
PR: https://git.openjdk.java.net/jfx/pull/138