TITLE:WindowAncestor(親ウィンドウ)の取得
#navi(../)
RIGHT:Posted by [[aterai]] at 2005-05-09
*WindowAncestor(親ウィンドウ)の取得 [#i3faa33c]
SwingUtilities.getWindowAncestor()などで、親ウィンドウを取得します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTWr-a0yaI/AAAAAAAAApo/Wm-nQMxDh4s/s800/WindowAncestor.png)

**サンプルコード [#vee7c80a]
#code{{
JButton button = new JButton(new AbstractAction("フレームのタイトルを表示") {
  public void actionPerformed(ActionEvent ae) {
    final JButton btn  = (JButton)ae.getSource();
    final JFrame frame = (JFrame)SwingUtilities.getWindowAncestor(btn);
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        JOptionPane.showMessageDialog(frame,
                    "親フレームのタイトル: "+frame.getTitle(),
                    "タイトル", JOptionPane.INFORMATION_MESSAGE);
      }
    });
  }
});
}}

**解説 [#dec5efc1]
自分(コンポーネント)の最初の上位ウィンドウ(親ウィンドウ)を取得します。

-[http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/SwingUtilities.html#getWindowAncestor(java.awt.Component) SwingUtilities.getWindowAncestor(Component c)]
--SwingUtilities.windowForComponent(Component c) は、getWindowAncestorをラップしただけのメソッド
--親のjava.awt.Window が返る
--親Window が無い場合は、null

-[http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/JComponent.html#getTopLevelAncestor() JComponent#getTopLevelAncestor()]
--自身の親コンテナ(java.awt.Window または java.awt.Applet) が返る
--親コンテナが無い場合は、null
--下のコメント参照

-[http://java.sun.com/javase/ja/6/docs/ja/api/javax/swing/JOptionPane.html#getFrameForComponent(java.awt.Component) JOptionPane.getFrameForComponent(Component parentComponent)]
--親のjava.awt.Frame が返る
--有効な親Frameが無い場合は JOptionPane.getRootFrame() で、非表示にしているTookKit Privateなフレームが返る
--JOptionPane用?

//**参考リンク
**コメント [#td33ce56]
- JComponent#getTopLevelAncestor()でもほぼ同じ内容が取得できるような感じですね(自分自身からスタートするか、親からスタートするかの違いはあるようですが)。ただ、この場合、Windowの他にAppletが戻される場合もあるようですが。 -- [[syo]] &new{2006-08-24 (木) 17:07:25};
- 補足ありがとうございます。WindowかAppletか気にする必要が無いのは便利そうですね。 -- [[aterai]] &new{2006-08-25 (金) 12:46:43};

#comment