如何知道何时将JComponent添加到它的父级?

时间:2013-08-28 19:05:34

标签: java swing jcomponent

首先,JComponent实例jComponent已创建。然后它被添加到它的父亲像parent.add(jComponent);。现在我想在jComponent课程中知道它已添加到它的父级。有可能吗?

目标是设置jComponent父级已添加到父级的父级,如:

Container window = getParent();
        while (!(window instanceof JWindow)) {
            window = window.getParent();
        }
JWindow parent = (JWindow) window;

4 个答案:

答案 0 :(得分:4)

根据您的需要,有多种选择。

如果您想知道何时将任何现有组件添加到父级,您可以向其添加HierarchyListener并侦听发送的类型为PARENT_CHANGED的事件之后,组件被添加到父组件中。

示例:

component.addHierarchyListener(new HierarchyListener() {

  @Override
  public void hierarchyChanged(HierarchyEvent e) {
    if ( (e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) {
      if (getParent() == e.getChangedParent()) {
         System.out.println("*** Added to parent " + e.getChangedParent());
      }
    }
  }
});

如果您已经在创建自定义组件,则可以覆盖“addNotify()”方法:

@Override public void addNotify() {
  super.addNotify();
  // do something here with getParent();
}

如果您只想知道 之后的组件,那么该组件可见,您可以使用AncestorListener。每个时间ancestorAdded(AncestorEvent)将被称为,使组件可见。例如,每当用户选择该选项卡进行显示时,JTabbedPane内的JPanel上的AncestorListener就会收到这样的事件。

答案 1 :(得分:3)

使用

javax.swing.SwingUtilities.getWindowAncestor(yourComponent)

它返回添加组件的窗口,如果没有添加到窗口,则返回null。

当然,如果您将组件添加到JPanel,而JPanel尚未添加到窗口中,则上述方法将返回null。

在这种情况下,其中一条注释更好:component.getParent()将为您提供包含组件的Container(如果存在)。

答案 2 :(得分:2)

您可能正在寻找显示hereAncestorListenerancestorAdded()方法将“通过调用setVisible(true)或将其添加到组件层次结构中使源或其祖先之一可见时调用。”

答案 3 :(得分:1)

所以答案是:

public class MyComponent extends JComponent {

   private JWindow parent;

   //(...)

   @Override
   public void addNotify() {
     parent = (JWindow) SwingUtilities.getAncestorOfClass(JWindow.class, getParent());
     super.addNotify();
   }

}

或者我们可以这样做:

   @Override
   public void addNotify() {
     parent = (JWindow) SwingUtilities.getWindowAncestor(this);
     super.addNotify();
   }

不知道哪个更好,看起来第二种方法更简单。