2

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

目标是jComponent在已将其添加到其父级时设置父级,例如:

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

4 回答 4

8

有多种选择,看你的需要。

如果您想知道任何现有组件何时添加到父组件,您可以向其添加 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每次组件可见时都会调用祖先添加(AncestorEvent)。 例如,每次用户选择要显示的选项卡时,JTabbedPane 内的 JPanel 上的 AncestorListener 都会收到这样的事件。

于 2013-08-28T23:36:39.657 回答
3

利用

javax.swing.SwingUtilities.getWindowAncestor(yourComponent)

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

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

在这种情况下,其中一条评论更好:component.getParent() 然后会给你包含你的组件的容器(如果有的话)。

于 2013-08-28T19:35:35.043 回答
2

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

于 2013-08-28T23:01:49.267 回答
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();
   }

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

于 2013-08-28T19:25:53.173 回答