Bug 568061

Summary: Incorrect Rendering of elements
Product: [Eclipse Project] Platform Reporter: Alan Knuth <Alex.hambasan2000>
Component: SWTAssignee: Platform-SWT-Inbox <platform-swt-inbox>
Status: NEW --- QA Contact:
Severity: normal    
Priority: P3    
Version: 4.17   
Target Milestone: ---   
Hardware: PC   
OS: Mac OS X   
Whiteboard:

Description Alan Knuth CLA 2020-10-21 04:17:48 EDT
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();
    }
}