CheckboxTableViewer第一列选择全部

时间:2015-08-11 14:36:35

标签: java eclipse eclipse-rcp jface

我目前正在开发一个向导,它将带我完成几个步骤。 在其中一个WizardPages上,我想要一个动态填充的表,用户可以在其中选择一些行。 我正在使用CheckboxTableViewer。 目前它运作良好(包括动态列数等) 结果如截图所示。current behaviour

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

  • 第一列标题(屏幕截图中的“nodeAlias”)应该从列顶部开始,而不是在复选框上方(因此需要向右移动一点)
  • 我希望复选框上方的标题中有一个复选框,用于执行“选择/取消全选”

我在向导页面(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的类定义,因为无论如何显示信息都有效。 (我想这对这个问题并不重要)。

2 个答案:

答案 0 :(得分:1)

为什么不看看星云网格小部件?你可以为列标题编写自己的CellRenderers。见here

答案 1 :(得分:0)

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

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

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