Почему SWT CTabItem не использует рекурсивный дочерний виджет?

Javadoc SWT CTabItem.dispose() отметил, что:

Этот метод не вызывается рекурсивно у потомков получателя

В чем причина этого? Если CTabItem расположен, дочерние виджеты больше не отображаются. Почему они не расположены рекурсивно?

Будет ли какая-либо проблема, если я переопределю метод CTabItem.dispose () для рекурсивного удаления дочерних виджетов?

Спасибо

1 ответ

Решение

Этот комментарий на самом деле находится в 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);
}

а также 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 уничтожить детей.

releaseChildren для Composite контроль это:

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)

Другие вопросы по тегам