Hello Alexandr,

Basically we need to detect and intercept focus changes.

java.awt.Component allows to override this methods: 
requestFocus()
requestFocus(boolean)
requestFocusInWindow()
requestFocusInWindow(boolean)

requestFocus() is only invoked when the component is focused by a mouse click.
But no requestFocus* method is invoked when a FocusTraversalPolicy is involed
(f. e. the user press TAB to focus next component).

sun.awt.RequestFocusController#acceptRequestFocus is invoked in both cases.

Attached a demo to reproduce it:
- if TextField is focused by a mouse click "requestFocus" and 
"acceptRequestFocus" is logged
- if TextField is focused by TAB only "acceptRequestFocus" is logged

Some more notes about the test program:
ComponentAccessorDelegator delegates all calls to the original 
ComponentAccessor implementation.
Only ComponentAccessor#setRequestFocusController is changed to keep our 
RequestFocusController implementation.

I have just filled a RFE on http://bugreport.java.com/bugreport

Thanks
Reto Merz


On 11/04/16 21:02, Alexander Scherbatiy wrote:
>  Hello Reto,
>
>  Could you provide use cases which illustrate tasks the requested API is 
> intended to solve in your application?
>
>  Please, also create a request in the bug system 
> http://bugreport.java.com/bugreport
>
>  Thanks,
> Alexandr.
>
>> On 11/04/16 12:26, Alexander Scherbatiy wrote:
>>
>>  Resending the request to awt-dev alias.
>>
>>  Thanks,
>>  Alexandr.
>>
>> On 4/4/2016 4:54 PM, Reto Merz wrote:
>>> Hello,
>>>
>>> Jigsaw will disallow access to internal packages.
>>> We have written a complex validation and focus management 
>>> implementation for our closed-source RIA and maintain it since JRE 
>>> 1.4.
>>>
>>> For this we use some internal API. We have a custom implementation of 
>>> these interfaces:
>>>
>>> sun.awt.RequestFocusController
>>> sun.awt.AWTAccessor.ComponentAccessor
>>>
>>> And use this getter and setter:
>>>
>>> sun.awt.AWTAccessor#setComponentAccessor(AWTAccessor.ComponentAccesso
>>> r)
>>> sun.awt.AWTAccessor#getComponentAccessor()
>>> sun.awt.AWTAccessor.ComponentAccessor#setRequestFocusController(Reque
>>> stFocusController)
>>>
>>>
>>> Please make this API public.
>>>
>>> Furthermore we need to call
>>> java.awt.Component#revalidateSynchronously().
>>> We do this with reflection. It would be nice to have a public API for 
>>> this.
>>> Maybe a new static method on AWTAccessor:
>>> AWTAccessor.revalidateSynchronously(Component)
>>>
>>> Best Regards
>>> Reto Merz
>>>
>>

Attachment: RequestFocusDemo.java
Description: Binary data

Reply via email to