Java 为什么SWT CTabItem不';不能递归地处理子窗口小部件?

Java 为什么SWT CTabItem不';不能递归地处理子窗口小部件?,java,swt,dispose,ctabitem,Java,Swt,Dispose,Ctabitem,SWT CTabItem.dispose()的函数提到: 此方法不会对接收器的后代递归调用 这背后的原因是什么?如果CTabItem被释放,子窗口小部件将不再显示。为什么不递归地处理它们 如果我重写CTabItem.dispose()方法以递归方式处理子窗口小部件,会有什么问题吗 感谢该注释实际上位于JavaDoc中,用于Widget类CTabItem的派生,它适用于所有控件 调用dispose时,通过调用子控件dispose方法,控件的子控件将被销毁,但不会被销毁 JavaDoc告诉您,如果您

SWT CTabItem.dispose()的函数提到:

此方法不会对接收器的后代递归调用

这背后的原因是什么?如果CTabItem被释放,子窗口小部件将不再显示。为什么不递归地处理它们

如果我重写CTabItem.dispose()方法以递归方式处理子窗口小部件,会有什么问题吗


感谢该注释实际上位于JavaDoc中,用于
Widget
CTabItem
的派生,它适用于所有控件

调用
dispose
时,通过调用子控件
dispose
方法,控件的子控件将被销毁,但不会被销毁

JavaDoc告诉您,如果您想知道控件何时被释放,那么重写
dispose
方法将不起作用,相反,您必须侦听
SWT.disposed
事件

Widget.dispose
的代码是:

public void dispose () {
    /*
    * Note:  It is valid to attempt to dispose a widget
    * more than once.  If this happens, fail silently.
    */
    if (isDisposed ()) return;
    if (!isValidThread ()) error (SWT.ERROR_THREAD_INVALID_ACCESS);
    release (true);
}
发布

void release (boolean destroy) {
    if ((state & DISPOSE_SENT) == 0) {
        state |= DISPOSE_SENT;
        sendEvent (SWT.Dispose);
    }
    if ((state & DISPOSED) == 0) {
        releaseChildren (destroy);
    }
    if ((state & RELEASED) == 0) {
        state |= RELEASED;
        if (destroy) {
            releaseParent ();
            releaseWidget ();
            destroyWidget ();
        } else {
            releaseWidget ();
            releaseHandle ();
        }
    }
}
因此,
release
方法调用
releaseChildren
来销毁这些子项

Composite
控件的
releaseChildren
为:

void releaseChildren (boolean destroy) {
    Control [] children = _getChildren ();
    for (int i=0; i<children.length; i++) {
        Control child = children [i];
        if (child != null && !child.isDisposed ()) {
            child.release (false);
        }
    }
    super.releaseChildren (destroy);
}
void releaseChildren(布尔销毁){
Control[]children=\u getChildren();

对于(int i=0;我想知道这个信息性的答案。只是在这里添加一个注释。我问这个问题是因为CTabItem的子项在CTabItem被释放后没有被释放,这会导致内存泄漏。正如你提到的,releaseChildren是在复合中实现的。小部件中的releaseChildren是no-op。因为CTabItem是从小部件而不是C继承的Composite,因此子项不会被释放或销毁。解决此问题的方法是侦听CTabItem上的SWT.disposed事件,并将控件集释放到CTabItem中。拥有CTabItem的CTabFolder从Composite派生而来,处理选项卡中的所有内容。如果您得到泄漏。情况似乎并非如此。关闭选项卡只需处置CTabItem,而不处置其中设置的控件。在处置CTabFolder之前,不会处置控件。