gpt4 book ai didi

java - 为什么 SWT CTabItem 不递归地处理子部件?

转载 作者:行者123 更新时间:2023-11-30 03:45:54 24 4
gpt4 key购买 nike

javadoc SWT CTabItem.dispose() 提到:

This method is not called recursively on the descendants of the receiver

这背后的原因是什么?如果 CTabItem 被释放,子窗口部件将不再显示。为什么它们不被递归处理?

如果我重写 CTabItem.dispose() 方法以递归方式处理子窗口小部件,会出现任何问题吗?

谢谢

最佳答案

该注释实际上位于 CTabItem 派生自的 Widget 类的 JavaDoc 中,它适用于所有控件。

当您调用dispose时,控件的子控件被销毁,但通过调用子控件dispose不会> 方法。

JavaDoc 告诉您,如果您想知道控件何时被释放,则重写 dispose 方法将不起作用,而是必须监听 SWT.Dispose > Activity 。

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);
}

因此,这会调用子控件上的release(不是 dispose)

关于java - 为什么 SWT CTabItem 不递归地处理子部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25717036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com