SWT CTabItem.dispose()的javadoc提到:
不会在接收者的后代上递归调用此方法
这背后的原因是什么?如果 CTabItem 被释放,则不再显示子小部件。为什么不递归处理它们?
如果我重写 CTabItem.dispose() 方法以递归方式处理子小部件,会有什么问题吗?
谢谢
该注释实际上在派生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
销毁孩子的方法。
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
)