Composite.changed(Control[] children) に気付きました。私が数年前に読んだ広範な記事があります:
http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html
この記事では、Composite.layout(boolean changed, boolean all) を呼び出してレイアウトを更新することについても言及しています。 ." それはすべて正しいことであり、それ以来私がやってきたことです。しかし、1 つまたはいくつかのコントロールの要件が変更されたためにレイアウトを更新したい場合、レイアウト キャッシュの利点が基本的に無効になるため、これは望ましいことではありません。
GridLayout に多数の StyledText ウィジェットがあり、そのうちの 1 つのサイズを変更する必要があるとします。StyledText で computeSize() を呼び出すと、非常にコストがかかります。これの代わりに:
違う:
parent.layout(true);
...要件が変更されていなくても、すべての子で computeSize() を呼び出します。これを行う必要があります:
右:
parent.changed(new Control[] { theChangedChild });
その後、どちらか
rootComposite.layout(false, true);
また
parent.layout(false);
あまり直感的ではありません。layout() へのパラメーターの名前が悪いだけです。「変更済み」と呼ぶ代わりに、「ignoreCache」などと呼ぶべきでした。直観的なことは、何かが変化したときに「true」を渡すことです。代わりに「false」を渡す必要がありますが、その前に changed() で変更されたコントロールだけのキャッシュを無効にします...
changed() を呼び出すと、その親の親 Control だけのキャッシュも再帰的に無効になることに注意してください。これは完全に理にかなっています。そのため、layout() を呼び出すときは、変更されたコントロールの親のサイズが応答して変更されるか変更されないことがわかっている場合を除き、all=true を指定してルート コンポジット (ほとんどの場合シェル) で呼び出す必要があります。