SWT - Table Viewer - hiding columns and getting values from columns

jkteater picture jkteater · Sep 20, 2012 · Viewed 7.4k times · Source

I am trying to create an arraylist from the data in my table. I need to get the values from the visible columns, but I also need to get values from columns that are not visible in the table. Using SWT with a Table Viewer, I have no idea on how to not display columns in my table. I also have no idea on how to pull the data from the table by specifying column names.

I have always used Swing, so I have always used a Table Model Class. In swing it is pretty simple to create the columns, hide them and get data from them.

This is how I have done it in previous Swing projects.

In my table model class:

public String getColumnName(int column) {
  String s = null;

  switch (column) {
     case ITEMID_COL: {
        s = "ItemId";
        break;
     }

Then the getValueAt()

 public Object getValueAt(int row, int column) {
  Object o = null;

  try {
     switch (column) {
        case ITEMID_COL: {
           o = rds.get(row).rev.getItem().getStringProperty("item_id");
           break;
        }

so when I needed the data from my table in any other class, all I had to do was

Object item_id = SingletonSelectTable.getInstance().getValueAt(i, SingletonSelectTable.getInstance().ITEMID_COL);

I could also easily hide columns by setting the MAX_COLUMNS.

Questions:

  1. I need to learn how to add columns to the table that are not going to be displayed but still contain values using a table viewer.

  2. I need to learn how to access the values from the table, so I can create a array of visible and non visible data from the columns.

  3. Is this even possible using a Table Viewer?

Answer

Baz picture Baz · Sep 20, 2012

Alright:

To hide a TableColumn, you can basically set its width to 0 and prevent resizing. Unhide it by setting the width to something >= 0 and enable resizing.

Since you are using a TableViewer with a ModelProvider, it does not matter that the columns are hidden when you want to access the content. Just get the Object from the model and get your information from it.

Here is an example that can hide/unhide the columns and still print the currently selected Person:

public static void main(String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(2, false));

    final TableViewer viewer = new TableViewer(shell, SWT.READ_ONLY);

    // First column is for the name
    TableViewerColumn col = createTableViewerColumn("Name", 100, 0, viewer);
    col.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public String getText(Object element) {
            if(element instanceof Person)
            {
                System.out.println("1");
                return ((Person)element).getName();
            }
            return "";
        }
    });

    // First column is for the location
    TableViewerColumn col2 = createTableViewerColumn("Location", 100, 1, viewer);
    col2.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public String getText(Object element) {
            if(element instanceof Person)
            {
                System.out.println("2");
                return ((Person)element).getLocation();
            }
            return "";
        }
    });

    final Table table = viewer.getTable();
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    GridData data = new GridData(SWT.FILL, SWT.FILL, true, true);
    data.horizontalSpan = 2;
    table.setLayoutData(data);

    /* This button will hide/unhide the columns */
    Button button1 = new Button(shell, SWT.PUSH);
    button1.setText("Hide / Unhide");

    button1.addListener(SWT.Selection, new Listener() {

        @Override
        public void handleEvent(Event arg0) {
            for(final TableColumn column : table.getColumns())
            {
                if(column.getWidth() == 0)
                {
                    column.setWidth(100);
                    column.setResizable(true);
                }
                else
                {
                    column.setWidth(0);
                    column.setResizable(false);
                }
            }
        }
    });

    /* This button will print the currently selected Person, even if columns are hidden */
    Button button2 = new Button(shell, SWT.PUSH);
    button2.setText("Print");

    button2.addListener(SWT.Selection, new Listener() {

        @Override
        public void handleEvent(Event arg0) {
            IStructuredSelection selection = (IStructuredSelection) viewer.getSelection();
            Person person = (Person) selection.getFirstElement();

            System.out.println(person);
        }
    });

    viewer.setContentProvider(ArrayContentProvider.getInstance());

    final Person[] persons = new Person[] { new Person("Baz", "Loc"),
            new Person("BazBaz", "LocLoc"), new Person("BazBazBaz", "LocLocLoc") };

    viewer.setInput(persons);

    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

private static TableViewerColumn createTableViewerColumn(String title, int bound, final int colNumber, TableViewer viewer) {
    final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
    final TableColumn column = viewerColumn.getColumn();
    column.setText(title);
    column.setWidth(bound);
    column.setResizable(true);
    column.setMoveable(false);

    return viewerColumn;
}

public static class Person {
    private String name;
    private String location;

    public Person(String name, String location) {
        this.name = name;
        this.location = location;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLocation() {
        return location;
    }

    public void setLocation(String location) {
        this.location = location;
    }

    public String toString()
    {
        return name + " " + location;
    }
}