Java 为什么SWT CTabItem不';不能递归地处理子窗口小部件?
SWT CTabItem.dispose()的函数提到: 此方法不会对接收器的后代递归调用 这背后的原因是什么?如果CTabItem被释放,子窗口小部件将不再显示。为什么不递归地处理它们 如果我重写CTabItem.dispose()方法以递归方式处理子窗口小部件,会有什么问题吗Java 为什么SWT CTabItem不';不能递归地处理子窗口小部件?,java,swt,dispose,ctabitem,Java,Swt,Dispose,Ctabitem,SWT CTabItem.dispose()的函数提到: 此方法不会对接收器的后代递归调用 这背后的原因是什么?如果CTabItem被释放,子窗口小部件将不再显示。为什么不递归地处理它们 如果我重写CTabItem.dispose()方法以递归方式处理子窗口小部件,会有什么问题吗 感谢该注释实际上位于JavaDoc中,用于Widget类CTabItem的派生,它适用于所有控件 调用dispose时,通过调用子控件dispose方法,控件的子控件将被销毁,但不会被销毁 JavaDoc告诉您,如果您
感谢该注释实际上位于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);
}
和发布
:
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
来销毁这些子项
Composite
控件的releaseChildren
为:
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);
}
void releaseChildren(布尔销毁){
Control[]children=\u getChildren();
对于(int i=0;我想知道这个信息性的答案。只是在这里添加一个注释。我问这个问题是因为CTabItem的子项在CTabItem被释放后没有被释放,这会导致内存泄漏。正如你提到的,releaseChildren是在复合中实现的。小部件中的releaseChildren是no-op。因为CTabItem是从小部件而不是C继承的Composite,因此子项不会被释放或销毁。解决此问题的方法是侦听CTabItem上的SWT.disposed事件,并将控件集释放到CTabItem中。拥有CTabItem的CTabFolder从Composite派生而来,处理选项卡中的所有内容。如果您得到泄漏。情况似乎并非如此。关闭选项卡只需处置CTabItem,而不处置其中设置的控件。在处置CTabFolder之前,不会处置控件。