Java tutorial
//package com.java2s; /* * This file is part of WebLookAndFeel library. * * WebLookAndFeel library 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 3 of the License, or * (at your option) any later version. * * WebLookAndFeel library 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 WebLookAndFeel library. If not, see <http://www.gnu.org/licenses/>. */ import javax.swing.*; import java.awt.*; import java.util.*; import java.util.List; public class Main { /** * Client property key that identifies that component can handle enabled state changes. */ public static final String HANDLES_ENABLE_STATE = "HANDLES_ENABLE_STATE"; /** * Disables component and all of its children recursively. * * @param component component to disable * @param startFromChilds whether should disable only component childs or not * @param excludePanels whether should exclude panels from disabling or not * @param excluded components to exclude from disabling * @return list of actually disabled components */ public static List<Component> disableRecursively(final Component component, final boolean startFromChilds, final boolean excludePanels, final Component... excluded) { return disableRecursively(component, startFromChilds, excludePanels, Arrays.asList(excluded)); } /** * Disables component and all of its children recursively. * * @param component component to disable * @param startFromChilds whether should disable only component childs or not * @param excludePanels whether should exclude panels from disabling or not * @param excluded components to exclude from disabling * @return list of actually disabled components */ public static List<Component> disableRecursively(final Component component, final boolean startFromChilds, final boolean excludePanels, final List<Component> excluded) { final List<Component> disabled = new ArrayList<Component>(); disableRecursively(component, startFromChilds, excludePanels, excluded, disabled); return disabled; } /** * Disables component and all of its children recursively. * * @param component component to disable * @param startFromChilds whether should disable only component childs or not * @param excludePanels whether should exclude panels from disabling or not * @param excluded components to exclude from disabling * @param disabled list of actually disabled components */ private static void disableRecursively(final Component component, final boolean startFromChilds, final boolean excludePanels, final List<Component> excluded, final List<Component> disabled) { final boolean b = !startFromChilds && !excluded.contains(component) && !(component instanceof JPanel && excludePanels); if (b && component.isEnabled()) { component.setEnabled(false); disabled.add(component); } if (component instanceof Container) { if (b && isHandlesEnableState(component)) { return; } final Container container = (Container) component; for (final Component child : container.getComponents()) { disableRecursively(child, false, excludePanels, excluded, disabled); } } } /** * Returns whether HANDLES_ENABLE_STATE mark is set in this component to true or not. * * @param component component to process * @return true if HANDLES_ENABLE_STATE mark is set in this component to true, false otherwise */ public static boolean isHandlesEnableState(final Component component) { if (component instanceof JComponent) { final Object handlesEnabledState = ((JComponent) component).getClientProperty(HANDLES_ENABLE_STATE); if (handlesEnabledState != null && handlesEnabledState instanceof Boolean && (Boolean) handlesEnabledState) { return true; } } return false; } }