CheckboxTableViewer 第一列 select 全部
CheckboxTableViewer first column select all
我目前正在开发一个向导,它将引导我完成几个步骤。
在其中一个 WizardPages 上,我希望有一个动态填充的 table,用户可以在其中选择一些行。
我为此使用 CheckboxTableViewer。
目前效果很好(包括动态列数等)
结果如屏幕截图所示。
我的问题是第一列跨越了带有复选框的列。我希望有以下行为:
- 第一列header(屏幕截图中的"nodeAlias")应该从列的顶部开始,而不是在复选框上方(因此它需要向右移动一点)
- 我想在执行 "select/deselect all"
的复选框上方的 header 中有一个复选框
我在向导页面 (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
我目前正在开发一个向导,它将引导我完成几个步骤。
在其中一个 WizardPages 上,我希望有一个动态填充的 table,用户可以在其中选择一些行。
我为此使用 CheckboxTableViewer。
目前效果很好(包括动态列数等)
结果如屏幕截图所示。
我的问题是第一列跨越了带有复选框的列。我希望有以下行为:
- 第一列header(屏幕截图中的"nodeAlias")应该从列的顶部开始,而不是在复选框上方(因此它需要向右移动一点)
- 我想在执行 "select/deselect all" 的复选框上方的 header 中有一个复选框
我在向导页面 (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