SWT CTabItem.dispose()的javadoc提到:
此方法不会在接收器的后代上递归调用
背后的原因是什么?如果放置了CTabItem,则不再显示子窗口小部件。为什么他们没有递归处理?
如果我覆盖CTabItem.dispose()方法以递归方式处理子窗口小部件,会不会有任何问题?
由于
答案 0 :(得分:2)
该注释实际上在Widget
类的JavaDoc中,CTabItem
派生自dispose
,它适用于所有控件。
当您致电dispose
时,控件的子项被销毁,但不则调用子控件dispose
方法。
JavaDoc告诉你,如果你想知道何时处理控件,覆盖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
(不 {{1}})