<Swing Dev> [11] RFR: JDK-8199441: Wrong caret position in multiline text components on Windows with a screen resolution higher than 100%

Prasanta Sadhukhan prasanta.sadhukhan at oracle.com
Fri Apr 27 06:52:24 UTC 2018


Hi All,

Please review a fix for an issue where it is seen that,
  with a screen resolution higher than 100% and then clicking in a 
JTextArea having setLineWrap(true) set, the caret (insertion point) is 
not aligned with the cursor.

The issue seems to stem from the fact that caret position calculation in 
DefaultCaret class utilises API that uses integer calculation than 
floating point calculations.
The code flow as seen is
DefaultCaret#positionCaret=>BasicTextUI#viewToModel=>BoxView.viewToModel=>CompositeView#viewToModel=>WrappedPlainView#viewToModel=>Utilities.getTabbedOffset
Now, getTabbedOffset utilises FontMetrics.charsWidth() which uses 
integer arithmetic to get the caret position.
The same getTabbedOffset uses Font.getStringBounds() which uses floating 
point arithmetic via Rectangle2D.Float.

Proposed fix is to make sure getTabbedOffset uses floating point 
calculations by using getStringBounds() instead of charsWidth() so that 
it calculates
the character width(s) of text present in JTextArea in floating point to 
align the caret.

Bug: https://bugs.openjdk.java.net/browse/JDK-8199441
webrev: http://cr.openjdk.java.net/~psadhukhan/8199441/webrev.00/

Regards
Prasanta



More information about the swing-dev mailing list