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

Posted

技术标签:

【中文标题】如何禁用嵌套 JPanel 的子组件但保持面板本身可用【英文标题】:How to disable the child-components of a nested JPanel but keep the panel itself usable 【发布时间】:2018-10-27 19:46:45 【问题描述】:

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

for (Component myComps : compPanel.getComponents())

                myComps.setEnabled(false);

    

组件位于嵌套的 JPanel 中,顺序为

JFrame ---> Main JPanel ---> Target JPanel(代码中的compPanel)---> Target Components

提前致谢!感谢所有帮助!

【问题讨论】:

【参考方案1】:

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


【讨论】:

太棒了,非常感谢!虽然当我尝试实现它时,我收到以下警告。 “List 类型不是通用的;它不能用参数 参数化”。我意识到这可能是一个菜鸟问题,但我错过了什么?提前致谢。 @VICWICIV 抱歉,如果不查看您的代码,我无法回答您的问题。也请把我的问题标记为有用,这样你也会得到一些声誉;)。 好吧,我明白了,如果我使用 pastebin 可以吗?还是我应该编辑我的 OP? :) @VICWICIV 请编辑您的问题并在这里给我写评论。 好的。我已经添加了重现问题所需的类和代码,这是大量的代码,但与原始程序相比却相当骨架化。我意识到这很多。但任何帮助和指点将不胜感激。如果有什么不清楚的地方,尽管问。

以上是关于如何禁用嵌套 JPanel 的子组件但保持面板本身可用的主要内容,如果未能解决你的问题,请参考以下文章

JPanel JScrollPanel

第十二周

从动态添加的 jPanel 中获取文本

JAVA布局管理器与面板组合

如何在 JTabbedPane 中读取 jpanel 的组件并将结果添加到组件中

在 JPanel 中获取组件的值