Как отключить дочерние компоненты вложенной JPanel, но сохранить саму панель в рабочем состоянии - PullRequest
0 голосов
/ 17 мая 2018

Итак, в моем JPanel есть несколько компонентов.Поскольку я хочу, чтобы пользователь мог добавлять компоненты в JPanel с помощью мыши, я хочу отключить все дочерние компоненты, уже присутствующие на панели, чтобы пользователь не мог щелкать их при добавлении новых компонентов.Я хочу знать, как отключить все компоненты, которые находятся внутри моей оригинальной JPanel.Я пытался использовать следующее:

for (Component myComps : compPanel.getComponents()){

                myComps.setEnabled(false);

    }

Компоненты расположены во вложенной JPanel, порядок будет

JFrame ---> Main JPanel ---> Target JPanel (compPanelв коде) ---> Целевые компоненты

Заранее спасибо!Вся помощь приветствуется!

1 Ответ

0 голосов
/ 17 мая 2018

Я написал метод, который можно использовать для получения всех компонентов, даже если они расположены во вложенных панелях. Метод может, например, получить все объекты JButton на панели. Но если вы хотите отключить все компоненты, вы должны искать JComponent.class.

/**
 * Searches for all children of the given component which are instances of the given class.
 *
 * @param aRoot start object for search.
 * @param aClass class to search.
 * @param <E> class of component.
 * @return list of all children of the given component which are instances of the given class. Never null.
 */
public static <E> List<E> getAllChildrenOfClass(Container aRoot, Class<E> aClass) {
    final List<E> result = new ArrayList<>();
    final Component[] children = aRoot.getComponents();
    for (final Component c : children) {
        if (aClass.isInstance(c)) {
            result.add(aClass.cast(c));
        }
        if (c instanceof Container) {
            result.addAll(getAllChildrenOfClass((Container) c, aClass));
        }
    }
    return result;
}

Так что в вашем случае вы должны переписать ваш цикл следующим образом:

for (Component myComps : getAllChildrenOfClass(compPanel, JComponent.class)){

            myComps.setEnabled(false);

}
...