- PR -

JPanelの親Panelの取得方法

投稿者投稿内容
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2007-01-29 10:55
JFrame内に、JPanel(jpane1)をprivateで含んでいます。そのJPanel内に、別のJPanelを継承した自作MyPanel(jpane2)を配置しました。

この際、jpane2から、jpane1 を参照するメソッド等がありますでしょうか?
APIを調べ、getParent()のようなメソッドがあったのですが、そうではないような挙動です。

現在、jpane1を、MyPanelのコンストラクタの引数渡して参照している状態です。

以上、アドバイスいただけると幸いです。

OS:WindowsXP
Ver:J2SDK1.4.1
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-01-29 12:00
getRootPane() あたりでしょうか?(自身なし)
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2007-01-29 12:30
引用:

NVさんの書き込み (2007-01-29 10:55) より:
JFrame内に、JPanel(jpane1)をprivateで含んでいます。そのJPanel内に、別のJPanelを継承した自作MyPanel(jpane2)を配置しました。

この際、jpane2から、jpane1 を参照するメソッド等がありますでしょうか?


java.awt.Component#getParent()で正しいです。

引用:

APIを調べ、getParent()のようなメソッドがあったのですが、そうではないような挙動です。


java.awt.Componentの親が変更されない限り、java.awt.Component#getParent()で取得できます。

どういう挙動を期待しているのでしょうか?
期待した挙動と異なるのであれば、コードのどこかで親を
変更してしまっているだけでしょう。

NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2007-01-29 13:53
ご回答ありがとうございます。

期待している挙動をしないとは、getParent()の結果、どうしてもnullが返ってきてしまうものでして。

その後気づいてみると、jpane1にて、MyPanelをArrayListで保持していました。
そうはいっても、親は変わらないとは思うのですが…。

以上、よろしくお願い致します。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2007-01-29 14:06
引用:

NVさんの書き込み (2007-01-29 13:53) より:
期待している挙動をしないとは、getParent()の結果、どうしてもnullが返ってきてしまうものでして。
その後気づいてみると、jpane1にて、MyPanelをArrayListで保持していました。
そうはいっても、親は変わらないとは思うのですが…。



いや、それ、「親」になってないですから。

この場合「親」にするには、jpanel1.add(jpanel2) とします。
そうすると jpanel2.getParent() が jpanel1 を返すようになるでしょう。

# panel(パネル) ? pane(ペーン) ? 意味を混同しないようにしましょう。
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2007-01-29 23:35
お返事遅れました。

言葉が足りなくてすみません。
一応、ArrayListで保持する前に、jpanel1.add(jpanel2)をしております。

その上で、nullが返ってきてしまいます。
どこかで参照が切れているとは思いますが、尚も錯誤中です。

ご回答ありがとうございます。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-01-30 00:00
コードをシンプルに、シンプルにしていきましょう。
ある瞬間現象が発生しなくなるはずです。
現象が発生するコードとしないコードの間にバグが潜んでいます。
コード:
$ cat Test.java 
import javax.swing.JPanel;
class Test{
  public static void main(String[] args){
    JPanel panel1 = new JPanel();
    JPanel panel2 = new JPanel();
    panel1.add(panel2);
    System.out.println(panel1.equals(panel2.getParent()));
  }
}


$ java -cp . Test
true
nekoyama
ベテラン
会議室デビュー日: 2005/03/12
投稿数: 71
投稿日時: 2007-01-30 00:46
コンポーネントツリーは、ルートコンテナをルート要素、
Componentを最小ノードとして、ツリー構造で構成されいます。

getParent()がnullを返すのは、コンポーネントツリーに接続されていない場合のみです。
それには、以下の2つが考えられます。
1.そもそも、親ノードに接続していない。
2.親ノードに接続されたが、その後、親ノードから切り離された。

原因を探るには、いくつか方法がありますが、
1つ目として、目的のコンポーネントを追加している(つもりの)java.awt.Containerに
java.awt.event.ContainerListenerを設定して、そのコールバックメソッドで
動作(追加、削除が行われているかどうか)を確認します。

2つ目は、MyPanel生成時に、以下のコードを記述して生成したMyPanelを使用して、
動作を確認します。

コード:
JPanel jpane1 = new MyPanel(){
 //コンストラクタは不明
 public void addNotify(){
  super.addNotify();
  //コンテナ追加時に下記スタックトレースが出力される
  if(true) new Exception("add").printStackTrace();
 }
 public void removeNotify(){
  super.removeNotify();
 //コンテナから切り離された時に下記スタックトレースが出力される
  if(true) new Exception("remove").printStackTrace();
 }
}
jpanel2.add(jpane1);
//bla bla bla


スキルアップ/キャリアアップ(JOB@IT)