为什么SWT CTabItem不会递归地处理子窗口小部件?

时间:2014-09-08 03:22:55

标签: java swt dispose ctabitem

SWT CTabItem.dispose()的javadoc提到:

  

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

背后的原因是什么?如果放置了CTabItem,则不再显示子窗口小部件。为什么他们没有递归处理?

如果我覆盖CTabItem.dispose()方法以递归方式处理子窗口小部件,会不会有任何问题?

由于

1 个答案:

答案 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}})