Bug 568061 - Incorrect Rendering of elements
Summary: Incorrect Rendering of elements
Status: NEW
Alias: None
Product: Platform
Classification: Eclipse Project
Component: SWT (show other bugs)
Version: 4.17   Edit
Hardware: PC Mac OS X
: P3 normal (vote)
Target Milestone: ---   Edit
Assignee: Platform-SWT-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-10-21 04:17 EDT by Alan Knuth CLA
Modified: 2020-10-21 04:17 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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();
    }
}