2009-05-13 6 views
5

コンポーネントがJPanelで見つかったかどうかをどのように判断できますか?JPanelでコンポーネントが見つかったかどうかを判断するための迅速な方法

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

ループを使用すると効率的ではありません。もっと良い方法はありますか?再帰的

+0

号は、単に 'false' に技術的な理由に基づいて再帰的に検索のための

jPanel.isAncestorOf(component) 

を使用することができます。 > 1番目の深さのレベルの親子関係を得るために、私は再帰呼び出しを達成するために使用します。私がTom Hawtin'sを読んだとき、私の最初の考えは、getComponentsが>第1深度レベルの子供たちを返すということです(これは真実ではありません)。したがって、私はまずそれがあなたのものよりも真っ直ぐであると考えていました。私の間違いです。答えはあなたのところに行くでしょう:) –

答えて

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

呼び出します(おそらく、うまく設計されたパネルの場合の)直接の親子関係を望んでいない場合。

...うまく設計されたパネルでは、コンポーネントがパネルに含まれているかどうかを知る必要があるのはなぜかというと疑問があります。

+1

+1 "...うまく設計されたパネルでは、コンポーネントがパネルに含まれているかどうかを知る必要があるのはなぜかというと疑問があります。 –

+0

ダイナミックパネルはパネルのデザインが不良ですか? – alphazero

+0

すべてに適したルールはありません。常識を使います。ダイナミックパネルは良いですし、私のユーザーはそれに満足しており、動的パネルは実行時に親/子を動的に発見する必要があります。私のユーザーが幸せになれば、コンポーネントがパネルに含まれているかどうかを知る必要があるときは疑問に思うことはありません。 –

3

この操作のパフォーマンスは、ボトルネックとなる可能性は非常に低いです。

コンテナの内容を見ると、おそらくデザインが不良であることがわかります。 GUIに何をすべきかを伝え、その状態を調べないでください。

おそらく、コードを書くためのより良い方法は、既存のルーチンを使用することです。いくつかのオーバーヘッドがありますが、すでにコンパイルされている可能性が高く(したがって速くなる可能性があります)、コードは少なくなります。

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

(またはkdgregoryの答えを使用しています。)