<Swing Dev> RFR JDK-8232243:Wrong caret position in JTextPane on Windows with a screen resolution > 100%

Philip Race philip.race at oracle.com
Sat Apr 25 14:31:47 UTC 2020


   96             SwingUtilities.invokeAndWait(() -> createUI());
   97
   98             Point p = textPane.getLocationOnScreen();

   99             Robot robot = new Robot();


For the sake of stability would it be better to create the robot and wait
for idle before getting the pane location ?

-phil.

On 4/24/20, 9:31 PM, Prasanta Sadhukhan wrote:
>
> Thanks for your review. All comments incorporated
>
> http://cr.openjdk.java.net/~psadhukhan/8232243/webrev.1/
>
> Regards
> Prasaant
> On 25-Apr-20 4:25 AM, Philip Race wrote:
>> In the test
>>    56         textPane.setFont(new java.awt.Font("Arial", Font.PLAIN, 12));
>>
>> you should use a font you know exists. If the idea is that this test is just
>> for windows, then @requires windows ?
>>
>> And
>>    94         System.setProperty( "sun.java2d.uiScale", "1.5" );
>>
>> should be set as a command line property to the test since that is what we do
>> elsewhere, then you can have the test run several times at different scales.
>>
>> Also currently 1.5 is truncated to 1 except on Windows ...
>>
>> If you want to test on Linux or Mac you need 2.
>> Another reason to use the command line way of doing it.
>>
>>
>> -phil
>>
>>
>> On 4/16/20, 3:16 AM, 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 JTextPane, 
>>> 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.
>>>
>>> This issue is in continuation to the fix done for JDK-8199441 where 
>>> the issue was fixed for JTextArea. 
>>> [http://hg.openjdk.java.net/jdk/jdk/rev/480c2ae4d031]
>>>
>>> The code flow for JTextArea was
>>> DefaultCaret#positionCaret=>BasicTextUI#viewToModel=>BoxView.viewToModel=>CompositeView#viewToModel=>WrappedPlainView#viewToModel=>Utilities.getTabbedOffset 
>>>
>>>
>>> whereas for JTextPane it it is 
>>> DefaultCaret#positionCaret=>BasicTextUI#viewToModel=>BoxView.viewToModel=>CompositeView#viewToModel=>GlyphPainter1#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 proper floating point getTabbedOffset 
>>> API is used so that floating point calculations is done for char width.
>>>
>>> Bug:https://bugs.openjdk.java.net/browse/JDK-8232243
>>>
>>> webrev: http://cr.openjdk.java.net/~psadhukhan/8232243/webrev.0/
>>>
>>> Regards
>>> Prasanta
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/swing-dev/attachments/20200425/cd1c9fbf/attachment.htm>


More information about the swing-dev mailing list