【问题标题】:A Fast Way to Determine Whether A Componet is Found In JPanel一种快速判断是否在 JPanel 中找到组件的方法
【发布时间】:2009-05-13 18:44:35
【问题描述】:

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

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

使用循环效率不高。有没有更好的办法?

【问题讨论】:

  • 没有。仅仅是基于“虚假”的技术原因。为了获得> 1st深度级别的父子关系,我使用递归调用来实现。在我阅读 Tom Hawtin 的时候,我的第一个想法是 getComponents 将返回 >1st depth level children(这是不正确的)。因此,我首先认为它比您的更直接,这让我不假思索地点击接受它作为答案。是我的错。答案将归你所有:)

标签: java swing


【解决方案1】:
if (c.getParent() == jPanel)

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

...虽然在精心设计的面板中,您为什么需要知道面板中是否包含组件是非常值得怀疑的。

【讨论】:

  • +1 表示“......虽然在精心设计的面板中,您为什么需要知道面板中是否包含组件是非常值得怀疑的。”
  • 动态面板是不是设计不佳的面板?
  • 没有适合所有人的规则。使用常识。动态面板很好,我的用户对此很满意,动态面板需要在运行时动态发现父/子。只要我的用户很高兴,当我需要知道面板中是否包含组件时,这是毫无疑问的。
【解决方案2】:

你可以使用

jPanel.isAncestorOf(component)

用于递归搜索

【讨论】:

    【解决方案3】:

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

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

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

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

    (或使用 kdgregory 的答案。)

    【讨论】:

      猜你喜欢
      • 2011-01-19
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2013-10-28
      • 2015-10-23
      • 2011-03-28
      相关资源
      最近更新 更多