如何使 CheckboxTableViewer 中的 SWTTable 可滚动?

How to make SWT Table in CheckboxTableViewer scrollable?

我找不到这个特殊情况的任何答案(使用 CheckboxTableViewer),所以我希望它不是重复的。

我在 Eclipse 视图中有以下 createPartControl() (3.x)。

我正在尝试在 GridLayout 中显示两个按钮和一个可检查的 table,如下所示

-------------------
| Button | Button |
-------------------
|      Table      |
-------------------

没什么了不起的。到目前为止一切都显示正常。我的 table 嵌入在 CheckboxTableViewer 中,只有一列,有时内容 (String) 比列宽长。所以我试图使 Table(通过 viewer.getTable() 获得,未明确构造!)可滚动以使所有内容可用。这不起作用,我不明白为什么。

我玩过 SWT 样式位(SWT.H_SCROLLSWT.V_SCROLL),我试过 ScrollableComponent,但无济于事。我无法让 ScrolledComponent 工作,因为我没有明确地构建我的 table,因此无法正确 setContents()

以下是我的 createPartControl().

的要点
public void createPartControl(Composite parent) {
    parent.setLayout(new GridLayout(2, false));

    addSelectionButtons(parent); // Works

    myTableViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER);
    myTableViewer.getTable().setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));

    Table myTable = (Table) myTableViewer.getControl();
    TableLayout tableLayout = new TableLayout();
    tableLayout.addColumnData(new ColumnWeightData(100, 50, true));
    myTable.setLayout(tableLayout);

    myTableViewer.setContentProvider(new MyContentProvider());

    TableViewerColumn viewerCol = new TableViewerColumn(myTableViewer, SWT.LEFT);
    TableColumn col = viewerCol.getColumn();
    col.setText("My column");
    viewerCol.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public String getText(Object element) {
            return text; // Dummy var
        }
    });

    myTableViewer.setInput(getInput()); // Gets model
    myTableViewer.getTable().setHeaderVisible(true);
    myTableViewer.getTable().setLinesVisible(true);
}

我知道这是临界点 "give me teh codez",但我确实找不到此设置的问题。

我回到第一个问题并以我能找到的最通用的方式re-implementing设法解决了这个问题。即:

  • 我添加了一个合适的 LabelProvider(并去掉了 ColumnLabelProvider),
  • 设置一个简单的 GridData 布局数据 object 到 table(否则没有搞砸),
  • 并大大简化了 TableColumn 部分(尽管 table 中只有一列,但我仍然需要声明一个 TableColumn 才能设置列标题) . 注意:TableColumn必须pack()编辑,否则内容不显示。来自 TableColumn API:“使接收器调整到其首选大小。

简单实用。

public void createPartControl(Composite parent) {
  parent.setLayout(new GridLayout(1, true));

  addSelectionButtons(parent); // Adds select/deselect all buttons

  myTableViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
  myTableViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
  myTableViewer.setContentProvider(new MyContentProvider());
  myTableViewer.setLabelProvider(new MyLabelProvider());
  myTableViewer.setInput(getInput()); // Gets model

  TableColumn column = new TableColumn(myTableViewer.getTable(), SWT.FILL);
  column.setText("My column");
  column.pack();

  myTableViewer.getTable().setHeaderVisible(true);
  myTableViewer.getTable().setLinesVisible(true);
}