SWT CTabItem.dispose()のjavadocには、次のように記載されています。
このメソッドは、レシーバーの子孫で再帰的に呼び出されません
その背後にある理由は何ですか?CTabItem が破棄されると、子ウィジェットは表示されなくなります。なぜ再帰的に破棄されないのですか?
CTabItem.dispose() メソッドをオーバーライドして、子ウィジェットを再帰的に破棄すると問題が発生しますか?
ありがとう
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
子コントロールを呼び出します ( not dispose
)