Community
Participate
Working Groups
After updating from Java 8 to Java 11, contents of a StructuredViewer seemingly are no longer updated upon calling StructuredViewer#setInput from another within the Display#asyncExec function, until there is an event of some sort (e.g. a Resize event). This issue seems to be present for all SWT applications on MacOS (version: 10.15.5) that use JRE >= 11. The behaviour described above does not occur if the application is ran via the JavaApplicationStub. import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.FillLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TableColumn; public class SampleSWT { public static void main(String[] args) { Display display = new Display(); Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final TableViewer viewer = new TableViewer(shell, SWT.BORDER | SWT.FULL_SELECTION ); TableLayout layout = new TableLayout(); layout.addColumnData(new ColumnWeightData(33, true)); layout.addColumnData(new ColumnWeightData(33, true)); layout.addColumnData(new ColumnWeightData(33, true)); viewer.getTable().setLayout(layout); viewer.getTable().setLinesVisible(true); viewer.getTable().setHeaderVisible(true); viewer.setContentProvider(new ArrayContentProvider()); viewer.setLabelProvider(new LabelProvider()); TableColumn column1 = new TableColumn(viewer.getTable(), SWT.CENTER ); column1.setText("First Name"); TableColumn column2 = new TableColumn(viewer.getTable(), SWT.CENTER ); column2.setText("Second Name"); TableColumn column3 = new TableColumn(viewer.getTable(), SWT.CENTER ); column3.setText("Status"); String[] input = {"FooBar"}; viewer.setInput(input); Display.getCurrent().asyncExec(() -> { viewer.setInput(null); // a call to refresh should not be needed here, yet even calling the refresh function // does not result in a redraw of the viewer contents viewer.refresh(); }); shell.open(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } display.dispose(); } }