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

Che*_*eng 8 java swing

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

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

使用循环效率不高.有没有更好的方法?

kdg*_*ory 13

if (c.getParent() == jPanel)
Run Code Online (Sandbox Code Playgroud)

如果您不想要直接的父子关系(在精心设计的面板中可能就是这种情况),请递归调用.

...虽然在一个设计良好的面板中,为什么你需要知道面板中是否包含一个组件,这是非常值得怀疑的.

  • 没有一种规则适合所有人。使用常识。动态面板很好,我的用户对此很满意,动态面板需要在运行时动态发现父/子。尽管我的用户很高兴,但当我需要知道面板中是否包含某个组件时,这毫无疑问。 (2认同)

Ale*_*lex 6

您可以使用

jPanel.isAncestorOf(component)
Run Code Online (Sandbox Code Playgroud)

用于递归搜索


Tom*_*ine 5

此操作的性能不太可能成为瓶颈。

查看容器中的内容可能表明设计不良。告诉 GUI 做什么,不要询问它的状态。

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

boolean isComponentInPanel(Component component) {
    return
        java.util.Arrays.asList(panel.getComponents())
            .contains(component);
}
Run Code Online (Sandbox Code Playgroud)

(或者使用 kdgregory 的答案。)