1

SWT CTabItem.dispose()のjavadocには、次のように記載されています。

このメソッドは、レシーバーの子孫で再帰的に呼び出されません

その背後にある理由は何ですか?CTabItem が破棄されると、子ウィジェットは表示されなくなります。なぜ再帰的に破棄されないのですか?

CTabItem.dispose() メソッドをオーバーライドして、子ウィジェットを再帰的に破棄すると問題が発生しますか?

ありがとう

4

1 に答える 1

2

そのコメントは、実際には派生元の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

releaseChildrenCompositeコントロールは次のとおりです。

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 )

于 2014-09-08T07:15:01.213 に答える