<AWT Dev> Proposal for consolidation of KeyboardFocusManagerPeer

Anton Tarasov anton.tarasov at oracle.com
Tue Nov 15 00:10:50 PST 2011


Hi Roman,

The peer methods you mentioned contain the following comment:

// TODO: consider moving it to KeyboardFocusManagerPeerImpl

So, it would be fine to do it.

Thanks,
Anton.

On 11/15/2011 1:35 AM, Roman Kennke wrote:
> Hi there,
>
> One thing that's bugging me for a while is how the ComponentPeer's
> requestFocus() method is supposed to work. As far as I could figure out,
> it's basically always like this (I use KFMHelper to call the
> corresponding KeyboardFocusManager's private methods by reflection):
>
>      public boolean requestFocus(Component lightweightChild, boolean
> temporary,
>              boolean focusedWindowChangeAllowed, long time, Cause cause)
> {
>          if (KFMHelper.processSynchronousLightweightTransfer(window,
>                  lightweightChild, temporary, focusedWindowChangeAllowed,
> time)) {
>              return true;
>          }
>
>          int result = KFMHelper.shouldNativelyFocusHeavyweight(window,
>                  lightweightChild, temporary, focusedWindowChangeAllowed,
> time,
>                  cause);
>
>          switch (result) {
>          case KFMHelper.SNFH_FAILURE:
>              return false;
>          case KFMHelper.SNFH_SUCCESS_PROCEED:
>                      requestFocusImpl(window, lightweightChild,
> temporary,
>                                   focusedWindowChangeAllowed, time,
> cause);
>          case KFMHelper.SNFH_SUCCESS_HANDLED:
>              // Either lightweight or excessive request - all events are
>              // generated.
>              return true;
>          default:
>              return false;
>          }
>      }
>
> The only thing that really differs between implementations would be the
> requestFocusImpl() method call in the SNFH_SUCCESS_PROCEED case. The
> rest seems to be the same in all implementations, except that in one
> case (Windows I believe) it is done in JNI while in others (X11) it's
> done by reflection.
>
> I think this can be consolidated by doing the above directly in the
> KeyboardFocusManager, before calling the peer requestFocus(), and have
> the peer's requestFocus() only do the requestFocusImpl() handling. This
> way we could avoid duplicate code and avoid reflection/JNI altogether.
>
> Maybe I am missing something?
>
> If not, I would work on a patch to move the above KeyboardFocusManager
> calls into the KFM and have the peer only bothers with the part that is
> requestFocusImpl() in the above example. Does that sound reasonable? It
> would certainly make some things simpler in OpenJDK as well as Cacio and
> the JavaFX SwingView that I am working on.
>
> Best regards, Roman
>
>




More information about the awt-dev mailing list