On Wed, 8 Feb 2023 20:12:28 GMT, Phil Race <p...@openjdk.org> wrote: >>> if we create a caret, then call setBlinkRate(), and then install() >>> then the blink rate appears to be ignored whereas before 4512626 it was >>> applied. >> >> Ok, if the text component is already visible and editable and focused and we >> install the new caret then the blink rate will not have an effect until the >> focus is lost and regained or until it became non-editable - and i think >> that was close to what we had before and there is a bug to investigate and >> optimize such corner case. In all other cases the code works fine. The value >> set is being preserved and will be reactivated when any of the methods such >> as focusGained or when the component installUI is called - if the cursor is >> set before component becomes visible - will cause to re-evaluate the blink >> rate and the stored value set by user will take place. > > Suppose I have this code > > Caret c = new DefaultCaret() > c.setBlinkRate(50); > c.install(editableJComponent); > > BEFORE 4512626 the JDK code looked like this > > if (rate != 0) { > if (flasher == null) { > flasher = new Timer(rate, handler); > } > flasher.setDelay(rate); > } > > > With your fix it looks like this > > if (rate != 0) { > if (component != null && component.isEditable()) { > if (flasher == null) { > flasher = new Timer(rate, handler); > } > } > } > > > So with my sample application code there's a change that my blink rate is > completely lost.
So it seems that in such a case, "savedBlinkRate" is still set and that is used to both report the value of blink rate *and* create & start a Timer when it is needed. It is a little hard to follow through all those "when it is needed" cases but if we are attached to an enabled & editable component when focusGained() is called it should then start the flasher timer. ------------- PR: https://git.openjdk.org/jdk20/pull/122