如何禁用嵌套 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 类型不是通用的;它不能用参数以上是关于如何禁用嵌套 JPanel 的子组件但保持面板本身可用的主要内容,如果未能解决你的问题,请参考以下文章