概要

SwingUtilities.getWindowAncestor()などで、親ウィンドウを取得します。

サンプルコード

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);
  }
});
View in GitHub: Java, Kotlin

解説

自分(コンポーネント)の最初の上位ウィンドウ(親ウィンドウ)を取得します。

  • SwingUtilities.getWindowAncestor(Component c)
    • SwingUtilities.windowForComponent(Component c)は、このgetWindowAncestorをラップしただけのメソッド
    • 親のjava.awt.Windowが返る
    • Windowが無い場合はnullが返る
    • 引数のComponent自体がWindowの場合そのWindowのオーナーWindowが返る
      • オーナーWindownullの場合はnullが返る
  • SwingUtilities.getRoot(Component c)
    • 親のComponent(java.awt.Windowまたはjava.awt.Applet)が返る
      • Windowの場合はc.getParent()で見つかる最初の上位Windowオブジェクトだが、Appletの場合はJComponent#getTopLevelAncestor()とは異なり最後の上位Appletオブジェクト
    • どちらも存在しない場合はnull
    • 引数のComponent自体がWindowの場合はそのまま自身が返る
  • JComponent#getTopLevelAncestor()
    • 自身の親Container(java.awt.Windowまたはjava.awt.Applet)が返る
    • Containerが無い場合はnull
    • java.awt.Windowまたはjava.awt.Appletから呼ばれた場合はそのまま自身が返る
    • 下のコメント参照

参考リンク

コメント