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

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Sat Apr 28 00:08:12 UTC 2018


Hi, Prasanta.
Please confirm that you run related jck/reg tests.

On 26/04/2018 23:52, Prasanta Sadhukhan wrote:
> 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


-- 
Best regards, Sergey.



More information about the swing-dev mailing list