Java 如何禁用嵌套JPanel的子组件,但保持面板本身可用

Java 如何禁用嵌套JPanel的子组件,但保持面板本身可用,java,swing,nested,jpanel,jcomponent,Java,Swing,Nested,Jpanel,Jcomponent,因此,在我的JPanel中,我有几个组件。因为我希望用户能够使用鼠标将组件添加到JPanel,所以我希望禁用面板中已经存在的所有子组件,以便用户在添加新组件时不能单击它们。我想知道如何禁用原始JPanel中的所有组件。我已尝试使用以下方法: for (Component myComps : compPanel.getComponents()){ myComps.setEnabled(false); } 组件位于嵌套的JPanel中,顺序如下 JFra

因此,在我的JPanel中,我有几个组件。因为我希望用户能够使用鼠标将组件添加到JPanel,所以我希望禁用面板中已经存在的所有子组件,以便用户在添加新组件时不能单击它们。我想知道如何禁用原始JPanel中的所有组件。我已尝试使用以下方法:

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

                myComps.setEnabled(false);

    }
组件位于嵌套的JPanel中,顺序如下

JFrame-->Main JPanel-->Target JPanel(代码中的compPanel)--->目标组件


提前谢谢!感谢您的帮助

我已经编写了一个方法,可以用来获取所有组件,即使它们被布置在嵌套面板中。例如,该方法可以在面板中获取所有
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;
}

太棒了,非常感谢!尽管当我尝试实现它时,我得到了以下警告。“类型列表不是泛型的;不能使用参数对其进行参数化”。我意识到这可能是一个noob问题,但我错过了什么?提前谢谢。@VICWICIV抱歉,如果不看你的代码,我无法回答你的问题。另外,请将我的问题标记为有用,这样您还可以获得一些声誉分数;)。好吧,我明白了,我可以用pastebin吗?或者我应该编辑我的OP吗?:)@请编辑你的问题,并在这里给我写评论。好的。我已经添加了重现该问题所需的类和代码,这是一大堆代码,但与原始程序相比,它已经变得非常僵化。我意识到这太多了。但任何帮助和指点都将不胜感激。如果有什么不清楚的地方,就问吧。
for (Component myComps : getAllChildrenOfClass(compPanel, JComponent.class)){

            myComps.setEnabled(false);

}