• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:WindowAncestor(親ウィンドウ)の取得
#navi(../)
*WindowAncestor(親ウィンドウ)の取得 [#i3faa33c]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2005-05-09~
更新日:&lastmod;
---
category: swing
folder: WindowAncestor
title: WindowAncestor(親ウィンドウ)の取得
tags: [JFrame, Window]
author: aterai
pubdate: 2005-05-09T21:28:35+09:00
description: SwingUtilities.getWindowAncestor()などで、親ウィンドウを取得します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWr-a0yaI/AAAAAAAAApo/Wm-nQMxDh4s/s800/WindowAncestor.png
---
* 概要 [#summary]
`SwingUtilities.getWindowAncestor()`などで、親ウィンドウを取得します。

#contents
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWr-a0yaI/AAAAAAAAApo/Wm-nQMxDh4s/s800/WindowAncestor.png)

**概要 [#a8e4cc0a]
SwingUtilities.getWindowAncestor()などで、親ウィンドウを取得します。

#screenshot

**サンプルコード [#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);
    //final JFrame frame = (JFrame)JOptionPane.getFrameForComponent(btn);
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        JOptionPane.showMessageDialog(frame,
                    "親フレームのタイトル: "+frame.getTitle(),
                    "タイトル", JOptionPane.INFORMATION_MESSAGE);
      }
    });
* サンプルコード [#sourcecode]
#code(link){{
JButton button = new JButton("show frame title");
button.addActionListener(e -> {
  // Container w = ((JComponent) e.getSource()).getTopLevelAncestor();
  Window w = SwingUtilities.getWindowAncestor((Component) e.getSource());
  // Frame frame = JOptionPane.getFrameForComponent((Component) e.getSource());
  if (w instanceof Frame) {
    Frame frame = (Frame) w;
    String msg = "parentFrame.getTitle(): " + frame.getTitle();
    JOptionPane.showMessageDialog(
        frame, msg, "title", JOptionPane.INFORMATION_MESSAGE);
  }
});
}}
-&jnlp;
-&jar;
-&zip;

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

SwingUtilities.getWindowAncestor、SwingUtilities.getRootメソッドを使うとjava.awt.Windowが、JOptionPane.getFrameForComponentメソッドを使うとjava.awt.Frameが返されます。
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/SwingUtilities.html#getWindowAncestor-java.awt.Component- SwingUtilities.getWindowAncestor(Component c)]
-- `SwingUtilities.windowForComponent(Component c)`は、この`getWindowAncestor`をラップしただけのメソッド
-- 親の`java.awt.Window`が返る
-- 親`Window`が無い場合は`null`が返る
-- 引数の`Component`自体が`Window`の場合その`Window`のオーナー`Window`が返る
--- オーナー`Window`が`null`の場合は`null`が返る
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/SwingUtilities.html#getRoot-java.awt.Component- SwingUtilities.getRoot(Component c)]
-- 親の`Component`(`java.awt.Window`または`java.awt.Applet`)が返る
--- `Window`の場合は`c.getParent()`で見つかる最初の上位`Window`オブジェクトだが、`Applet`の場合は`JComponent#getTopLevelAncestor()`とは異なり最後の上位`Applet`オブジェクト
-- どちらも存在しない場合は`null`
-- 引数の`Component`自体が`Window`の場合はそのまま自身が返る
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JComponent.html#getTopLevelAncestor-- JComponent#getTopLevelAncestor()]
-- 自身の親`Container`(`java.awt.Window`または`java.awt.Applet`)が返る
-- 親`Container`が無い場合は`null`
-- `java.awt.Window`または`java.awt.Applet`から呼ばれた場合はそのまま自身が返る
-- 下のコメント参照

//**参考リンク
**コメント [#td33ce56]
- JComponent#getTopLevelAncestor()でもほぼ同じ内容が取得できるような感じですね(自分自身からスタートするか、親からスタートするかの違いはあるようですが)。ただ、この場合、Windowの他にAppletが戻される場合もあるようですが。 -- [[syo]] &new{2006-08-24 (木) 17:07:25};
- 補足ありがとうございます。WindowかAppletか気にする必要が無いのは便利そうですね。 -- [[terai]] &new{2006-08-25 (金) 12:46:43};
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/JOptionPane.html#getFrameForComponent-java.awt.Component- JOptionPane.getFrameForComponent(Component parentComponent)]
-- 親の`java.awt.Frame`が返る
-- 有効な親`Frame`が無い場合は`JOptionPane.getRootFrame()`で非表示にしている`TookKit Private`なフレームが返る
-- `JOptionPane`用?

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

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

#comment