Swing/WindowAncestor の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/WindowAncestor へ行く。
- Swing/WindowAncestor の差分を削除
--- 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()`などで、親ウィンドウを取得します。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTWr-a0yaI/AAAAAAAAApo/Wm-nQMxDh4s/s800/WindowAncestor.png) * サンプルコード [#sourcecode] #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); 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( f, "parentFrame.getTitle(): " + f.getTitle(), "title", JOptionPane.INFORMATION_MESSAGE); frame, msg, "title", JOptionPane.INFORMATION_MESSAGE); } })); }); }} * 解説 [#explanation] 自分(コンポーネント)の最初の上位ウィンドウ(親ウィンドウ)を取得します。 - [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`から呼ばれた場合はそのまま自身が返る -- 下のコメント参照 - [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