Почему 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
)