首先,JComponent
实例jComponent
已创建。然后它被添加到它的父亲像parent.add(jComponent);
。现在我想在jComponent
课程中知道它已添加到它的父级。有可能吗?
目标是设置jComponent
父级已添加到父级的父级,如:
Container window = getParent();
while (!(window instanceof JWindow)) {
window = window.getParent();
}
JWindow parent = (JWindow) window;
答案 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)
您可能正在寻找显示here的AncestorListener
。 ancestorAdded()
方法将“通过调用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();
}
不知道哪个更好,看起来第二种方法更简单。