首先,创建了
JComponent
实例 jComponent
。然后它被添加到它的父级,如parent.add(jComponent);
。现在我想知道在 jComponent
类中它已添加到其父级中。可以这样做吗?
目标是在
jComponent
已添加到其父级时设置父级,例如:
Container window = getParent();
while (!(window instanceof JWindow)) {
window = window.getParent();
}
JWindow parent = (JWindow) window;
有多种选择,取决于您的需求。
如果您想知道何时将任何现有组件添加到父级,您可以向其添加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();
}
如果您只想在组件可见后。每次组件可见时都会调用
ancestorAdded(AncestorEvent)
。例如,每当用户选择要显示的选项卡时,
AncestorListener
内的JPanel
上的JTabbedPane
都会收到这样的事件。使用
它返回添加组件的窗口,如果未添加到窗口,则返回 null。
当然,如果您将组件添加到 JPanel,而 JPanel 尚未添加到窗口中,则上面的方法将返回 null。
在这种情况下,其中一条注释更好:component.getParent() 将为您提供包含您的组件的容器(如果存在)。
您可能正在寻找
AncestorListener
或者我们可以这样做:
@Override
public void addNotify() {
parent = (JWindow) SwingUtilities.getWindowAncestor(this);
super.addNotify();
}
不知道哪个更好,看起来第二种方法更简单。