Я только что узнал о Composite.changed (Control [] children). Есть обширная статья, которую я прочитал пару лет назад:
http://www.eclipse.org/articles/article.php?file=Article-Understanding-Layouts/index.html
В этой статье также упоминается вызов Composite.layout (логическое значение изменено, логическое значение все) для обновления макета: «Вызов layout () аналогичен вызову layout (true), который указывает ColumnLayout очищать свои кэши перед установкой границ из детей. " Это все правильно, и что я делаю с тех пор. Но это не то, что нужно, так как он в основном сводит на нет преимущества кэша макета, когда вы хотите обновить макет, потому что один или несколько элементов управления изменили требования.
Представьте, что у вас есть набор виджетов StyledText в GridLayout, и вам нужно изменить размер одного из них. Вызов computeSize () для StyledText очень дорогой. Вместо этого:
Неправильно:
parent.layout(true);
... который вызывает computeSize () для всех дочерних элементов, даже если их требования не изменились. Вы должны сделать это:
Справа:
parent.changed(new Control[] { theChangedChild });
Тогда либо
rootComposite.layout(false, true);
или
parent.layout(false);
Не очень интуитивно понятно. Параметр для layout () просто имеет неправильное имя. Вместо того, чтобы называть его «измененным», его нужно было назвать «ignoreCache» или что-то в этом роде. Интуитивно понятная вещь - передать «истину», когда что-то изменилось. Вместо этого вам нужно передать «false», но сделать недействительным кеш для только что измененного элемента управления с помощью метода change (), прежде чем вы ...
Обратите внимание, что вызов change () также рекурсивно сделает недействительной кэш-память только для родительского элемента управления в его собственном родительском элементе, что вполне логично. Поэтому, когда вы вызываете layout (), вы должны вызывать его для корневого композита (чаще всего для Shell) со значением all = true, если только вы не знаете, что размер родительского элемента измененного элемента управления изменится или не сможет измениться в ответ.