/** Builds the layout. */ private static void buildLayout(Scrollable control, AbstractColumnLayout layout, List<? extends Widget> columns, List<? extends ColumnBuilder> columnBuilders) { // create the layout for (int i = 0; i < columns.size(); ++i) { layout.setColumnData(columns.get(i), columnBuilders.get(i).dataBuilder.data); } control.getParent().setLayout(layout); // update the layout on every resize SwtMisc.asyncLayoutOnResize(control.getParent()); // sometimes complicated trees can take a long time to get settled, so we'll do some last-ditch checks Runnable checkLayout = () -> { control.getParent().layout(true, true); }; SwtExec.Guarded guarded = SwtExec.async().guardOn(control); guarded.timerExec(500, checkLayout); guarded.timerExec(1000, checkLayout); guarded.timerExec(2000, checkLayout); }