1

SWT CTabItem.dispose()的javadoc提到:

不会在接收者的后代上递归调用此方法

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

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

谢谢

4

1 回答 1

2

该注释实际上在派生Widget类的 JavaDoc 中,它适用于所有控件。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);
}

release

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销毁孩子的方法。

releaseChildrenComposite控制是:

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);
}

所以这会调用release子控件(不是 dispose

于 2014-09-08T07:15:01.213 回答