CheckboxTableViewer 第一列 select 全部

CheckboxTableViewer first column select all

我目前正在开发一个向导,它将引导我完成几个步骤。 在其中一个 WizardPages 上,我希望有一个动态填充的 table,用户可以在其中选择一些行。 我为此使用 CheckboxTableViewer。 目前效果很好(包括动态列数等) 结果如屏幕截图所示。

我的问题是第一列跨越了带有复选框的列。我希望有以下行为:

我在向导页面 (extends WizardPage) 中使用的代码如下所示:

public class ShowResults extends WizardPage {
    private Table table;

    public ShowResults() {
        super("wizardPage");
        setTitle("Title");
        setDescription("Description");
    }

    public void createControl(Composite parent) {
        Composite container = new Composite(parent, SWT.NULL);

        setControl(container);
        container.setLayout(new GridLayout(1, false));

        CheckboxTableViewer checkboxTableViewer = CheckboxTableViewer.newCheckList(container, SWT.BORDER | SWT.FULL_SELECTION);
        createColumns(checkboxTableViewer);
        table = checkboxTableViewer.getTable();
        table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        table.setHeaderVisible(true);
        table.setLinesVisible(true); 

        checkboxTableViewer.setContentProvider(ArrayContentProvider.getInstance());

        checkboxTableViewer.setInput(getData()); // returns a list of Record-Objects
    }


    private void createColumns(CheckboxTableViewer checkboxTableViewer) {
        // get the required columns as list and act for each
        for(String columnName : getColumnNames()){
            // create a column for the first name
            TableViewerColumn colFirstName = new TableViewerColumn(checkboxTableViewer, SWT.NONE);
            colFirstName.getColumn().setWidth(150);
            colFirstName.getColumn().setText(columnName);
            colFirstName.setLabelProvider(new ColumnLabelProvider() {
              @Override
              public String getText(Object element) {
                Record r = (Record) element;
                return r.getValue(columnName);
              }
            });
        }

    }

我没有包括 Record 的 class 定义,因为信息显示仍然有效。 (我想这对这个问题来说并不重要)。

另一种解决方案可能是不使用 header。只表现得像你有一个:

在您的 table 中保留一行作为固定的第一个元素,并向该特殊模型后面的元素添加一个唯一的 setter。它不仅应该设置自己的值,还应该设置列表中的其他元素值。它的其他成员将充当静态 header.

否则,如果您设法获得 header 中的复选框,并且它可以在您的平台(看起来是 MacOS)上运行,它可能仍然无法在另一个平台上运行。

为什么不看看 Nebula 网格小部件?您可以为列 headers 编写自己的 CellRenderer。参见 here