On Thu, 28 May 2020 06:50:57 GMT, Robert Lichtenberger <rlich...@openjdk.org> 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