快速确定组件是否在JPanel中的方法

8

我可以知道如何确定一个组件是否在JPanel中找到吗?

boolean isThisComponentFoundInJPanel(Component c)
{
    Component[] components = jPanel.getComponents();
    for (Component component : components) {
        if (c== component) {
                return true;
        }
    }
    return false;
}

使用循环不够高效。有更好的方法吗?


不是因为技术原因而仅仅是基于“false”。为了获得>1级深度的父子关系,我必须使用递归调用来实现。当我读到Tom Hawtin的时候,我的第一个想法是getComponents将返回>1级深度的子元素(这是不正确的)。因此,我最初认为它比你的更直接,这使我在没有多想的情况下点击接受它作为答案。这是我的错误。答案应该归你 :) - Cheok Yan Cheng
3个回答

15
if (c.getParent() == jPanel)

如果你不想立即建立父子关系(这可能是在一个设计良好的面板中的情况),可以进行递归调用。

...尽管在设计良好的面板中,你为什么需要知道组件是否包含在面板中非常值得怀疑。


1
在一个设计良好的面板中,你需要知道组件是否包含在面板中是非常值得怀疑的。 - Alex B
动态面板是一个设计不良的面板吗? - alphazero
2
没有一条规则适用于所有情况。要运用常识。动态面板很好,我的用户对此非常满意,而且动态面板需要在运行时动态地发现父/子关系。只要我的用户满意,当我需要知道一个组件是否包含在面板中时,就没有什么可质疑的了。 - Cheok Yan Cheng

10

您可以使用

jPanel.isAncestorOf(component)

用于递归搜索


5

这个操作的性能很可能不会成为瓶颈。

浏览容器的内容可能表明设计有问题。告诉GUI该做什么,而不是询问它的状态。

编写代码的更好方式可能是使用现有的例程。虽然存在一些开销,但它们更有可能已经被编译(因此可能更快),而且代码更少。

boolean isComponentInPanel(Component component) {
    return
        java.util.Arrays.asList(panel.getComponents())
            .contains(component);
}

(或使用kdgregory的答案。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接