• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:WindowAncestor(親ウィンドウ)の取得
#navi(../)
#tags()
#tags(JFrame, Window)
RIGHT:Posted by &author(aterai); at 2005-05-09
*WindowAncestor(親ウィンドウ)の取得 [#i3faa33c]
SwingUtilities.getWindowAncestor()などで、親ウィンドウを取得します。
* WindowAncestor(親ウィンドウ)の取得 [#i3faa33c]
`SwingUtilities.getWindowAncestor()`などで、親ウィンドウを取得します。

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

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

**サンプルコード [#vee7c80a]
** サンプルコード [#vee7c80a]
#code(link){{
JButton button = new JButton(new AbstractAction("フレームのタイトルを表示") {
  @Override public void actionPerformed(ActionEvent e) {
    JButton btn  = (JButton)e.getSource();
    JFrame f = (JFrame)SwingUtilities.getWindowAncestor(btn);
    //JFrame f = (JFrame)btn.getTopLevelAncestor();
    //JFrame f = (JFrame)JOptionPane.getFrameForComponent(btn);
    JOptionPane.showMessageDialog(f, "parentFrame.getTitle(): "+f.getTitle(),
                                  "title", JOptionPane.INFORMATION_MESSAGE);
  }
}));
}}

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

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

-[http://docs.oracle.com/javase/jp/6/api/javax/swing/SwingUtilities.html#getRoot(java.awt.Component) SwingUtilities.getRoot(Component c)]
--親のjava.awt.Component(java.awt.Window または java.awt.Applet)が返る
---Window の場合は、c.getParent() で見つかる最初の上位 Window オブジェクトだが、Applet の場合は、JComponent#getTopLevelAncestor()とは異なり、最後の上位 Applet オブジェクト
--どちらも存在しない場合は、null
- [http://docs.oracle.com/javase/jp/6/api/javax/swing/SwingUtilities.html#getRoot(java.awt.Component) SwingUtilities.getRoot(Component c)]
-- 親の`java.awt.Component(java.awt.Window または java.awt.Applet)`が返る
--- `Window`の場合は、`c.getParent()`で見つかる最初の上位`Window`オブジェクトだが、`Applet`の場合は、`JComponent#getTopLevelAncestor()`とは異なり、最後の上位`Applet`オブジェクト
-- どちらも存在しない場合は、`null`

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

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

**参考リンク [#q80fd7f2]
-[http://docs.oracle.com/javase/jp/6/api/javax/swing/SwingUtilities.html#getRoot(java.awt.Component) SwingUtilities.getRoot(Component c)] を追加
** 参考リンク [#q80fd7f2]
- [http://docs.oracle.com/javase/jp/6/api/javax/swing/SwingUtilities.html#getRoot(java.awt.Component) SwingUtilities.getRoot(Component c)] を追加
-- via: [http://stackoverflow.com/questions/9650874/java-swing-obtain-window-jframe-from-inside-a-jpanel Java/Swing: Obtain Window/JFrame from inside a JPanel - Stack Overflow]

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

#comment