如何知道 JComponent 何时添加到其父级?

问题描述 投票:0回答:4

首先,创建了

JComponent
实例
jComponent
。然后它被添加到它的父级,如
parent.add(jComponent);
。现在我想知道在
jComponent
类中它已添加到其父级中。可以这样做吗?

目标是在

jComponent
已添加到其父级时设置父级,例如:

Container window = getParent();
        while (!(window instanceof JWindow)) {
            window = window.getParent();
        }
JWindow parent = (JWindow) window;
java swing jcomponent
4个回答
9
投票

有多种选择,取决于您的需求。

如果您想知道何时将任何现有组件添加到父级,您可以向其添加HierarchyListener

并监听类型为
PARENT_CHANGED
的事件,该事件在组件添加到
之后发送家长。

示例:

component.addHierarchyListener(new HierarchyListener() { @Override public void hierarchyChanged(HierarchyEvent e) { if ( (e.getChangeFlags() & HierarchyEvent.PARENT_CHANGED) != 0) { if (component.getParent() == e.getChangedParent()) { System.out.println("*** Added to parent " + e.getChangedParent()); } } } });
注意,层次结构中的每次更改都会调用此事件,为了缩小当前组件的范围,需要防护

component.getParent() == e.getChangedParent()

如果您已经在创建自定义组件,则可以重写

addNotify()

 方法:

@Override public void addNotify() { super.addNotify(); // do something here with getParent(); }
如果您只想在组件可见后

了解父组件,则可以使用 AncestorListener

。每次组件可见时都会调用 
ancestorAdded(AncestorEvent)
。例如,每当用户选择要显示的选项卡时,
AncestorListener
内的JPanel上的
JTabbedPane
都会收到这样的事件。
    
使用


4
投票

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

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

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

您可能正在寻找

AncestorListener

3
投票
此处

所示。

ancestorAdded()
方法将“当通过调用 setVisible(true) 或将其添加到组件层次结构而使源或其祖先之一可见时调用。”
    
所以答案是:


1
投票

或者我们可以这样做:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.