Java Swing Focus smartRequestFocus(Component component)

Here you can find the source of smartRequestFocus(Component component)

Description

Requests focus for a component.

License

Open Source License

Parameter

Parameter Description
component the component to request focus for

Return

the component which has focus or probably will obtain focus, null if no component will receive focus

Declaration

public static Component smartRequestFocus(Component component) 

Method Source Code


//package com.java2s;
/*/*www . j  a  va2  s.c  o  m*/
 * Copyright (C) 2004 NNL Technology AB
 * Visit www.infonode.net for information about InfoNode(R) 
 * products and how to contact NNL Technology AB.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, 
 * MA 02111-1307, USA.
 */

import javax.swing.*;

import java.awt.*;

public class Main {
    /**
     * Requests focus for a component. If that's not possible it's
     * {@link FocusTraversalPolicy}is checked. If that doesn't work all it's
     * children is recursively checked with this method.
     *
     * @param component the component to request focus for
     * @return the component which has focus or probably will obtain focus, null
     *         if no component will receive focus
     */
    public static Component smartRequestFocus(Component component) {
        if (requestFocus(component))
            return component;

        if (component instanceof JComponent) {
            FocusTraversalPolicy policy = ((JComponent) component).getFocusTraversalPolicy();

            if (policy != null) {
                Component focusComponent = policy.getDefaultComponent((Container) component);

                if (focusComponent != null && requestFocus(focusComponent)) {
                    return focusComponent;
                }
            }
        }

        if (component instanceof Container) {
            Component[] children = ((Container) component).getComponents();

            for (int i = 0; i < children.length; i++) {
                component = smartRequestFocus(children[i]);

                if (component != null)
                    return component;
            }
        }

        return null;
    }

    /**
     * Requests focus unless the component already has focus. For some weird
     * reason calling {@link Component#requestFocusInWindow()}when the
     * component is focus owner changes focus owner to another component!
     *
     * @param component the component to request focus for
     * @return true if the component has focus or probably will get focus,
     *         otherwise false
     */
    public static boolean requestFocus(Component component) {
        /*
         * System.out.println("Owner: " +
         * System.identityHashCode(KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner()) + ", " +
         * System.identityHashCode(component) + ", " +
         * (KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() ==
         * component));
         */
        return KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner() == component
                || component.requestFocusInWindow();
    }
}

Related

  1. setFocus(JComponent component)
  2. setFocusableRecursively(final JComponent component, final boolean focusable, final boolean childsOnly)
  3. setFocusOn(Component component)
  4. setFocusOrder(JComponent... components)
  5. setNextFocusable(JComponent component, final JComponent nextFocusable)