【发布时间】:2016-10-14 12:08:29
【问题描述】:
我创建了一个包含两列的 TableViewer,我想在按下一个名为“add”的按钮后向其中添加行。按下按钮后,我想创建一个空行,第一列单元格将提供输入文本的选项,第二列单元格将提供在系统目录中浏览以选择文件夹的选项。
单击“添加”按钮后,我设法添加了一个空行,但它返回以下错误:发生错误。有关详细信息,请参阅错误日志。断言失败:第 0 列没有标签提供者。 tableviewer 的目的是在第一列单元格中插入一个字符串变量,在第二列单元格中插入一个路径。使用用户插入的数据,我想创建一个名为 ProjectDirectory 的类的列表(该类有两个 String 属性)。
我还设法删除了我用鼠标选择的行,这很好。
我是使用 Jface 和 SWT 的新手,但我无法做到这一点。谁能帮帮我?
代码:
Composite tableComposite = new Composite(pluginPathCreatedComposite, SWT.NONE);
FormData tableCompositeData = new FormData();
tableCompositeData.left = new FormAttachment(selectProjectPathLabel, 0, SWT.LEFT);
tableCompositeData.top = new FormAttachment(selectProjectPathLabel, 40, SWT.TOP);
tableCompositeData.right = new FormAttachment(selectProjectPathButton,-10,SWT.LEFT);
tableCompositeData.bottom = new FormAttachment(createProjectConfigButton,-10,SWT.TOP);
tableComposite.setLayoutData(tableCompositeData);
//Create the tableviewer
tableViewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
Table table = tableViewer.getTable();
tableViewer.getTable().setLinesVisible(true);
tableViewer.getTable().setHeaderVisible(true);
tableViewer.setColumnProperties(COLUMN_HEADINGS);
//Create the tableViewer columns
TableViewerColumn variable = new TableViewerColumn(tableViewer, SWT.NONE);
variable.getColumn().setText(COLUMN_HEADINGS[0]);
variable.getColumn().setResizable(false);
TableViewerColumn path = new TableViewerColumn(tableViewer, SWT.NONE);
path.getColumn().setText(COLUMN_HEADINGS[1]);
path.getColumn().setResizable(false);
TableColumnLayout tableLayout = new TableColumnLayout();
tableComposite.setLayout(tableLayout);
//Set the columns proportions
tableLayout.setColumnData(path.getColumn(), new ColumnWeightData(50));
tableLayout.setColumnData(variable.getColumn(), new ColumnWeightData(50));
//Set the first row as TextCell (this doesn´t work)
CellEditor[] editors = new CellEditor[2];
editors[0] = new TextCellEditor(tableViewer.getTable());
editors[1] = new TextCellEditor(tableViewer.getTable());
tableViewer.setCellEditors(editors);
//Add button
Button addRow = new Button(pluginPathCreatedComposite, SWT.NONE);
FormData addRowData = new FormData();
addRowData.top = new FormAttachment(tableComposite,0,SWT.TOP);
addRowData.left = new FormAttachment(selectProjectPathButton,0,SWT.LEFT);
addRowData.right = new FormAttachment(selectProjectPathButton,0,SWT.RIGHT);
addRow.setLayoutData(addRowData);
addRow.setText("Add");
addRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ProjectDirectory directory = new ProjectDirectory("A", "A");
Table table = tableViewer.getTable();
tableViewer.add(directory);
table.setTopIndex(table.getItemCount());
table.select(table.getItemCount() - 1);
}
});
//Delete row
Button deleteRow = new Button(pluginPathCreatedComposite, SWT.NONE);
FormData deleteRowData = new FormData();
deleteRowData.top = new FormAttachment(addRow,5,SWT.BOTTOM);
deleteRowData.left = new FormAttachment(selectProjectPathButton,0,SWT.LEFT);
deleteRowData.right = new FormAttachment(selectProjectPathButton,0,SWT.RIGHT);
deleteRow.setLayoutData(deleteRowData);
deleteRow.setText("Delete");
deleteRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ISelection selection = tableViewer.getSelection();
if (selection instanceof IStructuredSelection) {
Iterator iterator = ((IStructuredSelection) selection).iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
tableViewer.remove(obj);
}
}
}
});
图片:
编辑:
我创建了一个内容提供程序来获取在代码中创建的列表的 ProjectDirectories(我将来会更改它)。之后,我为每一列创建了一个标签提供程序,它显示了我想要的数据。
事实是,我想在按下添加按钮后在表格中添加一个新行,并且我想让第一个单元格成为 TextCellEditor(第二个单元格将有一个事件来打开系统的目录路径为图像之一,但在此之前,我还想将其设为 TextCellEditor)。我已经定义了这两列就像 TextCell 编辑器一样,在按下添加按钮后,我设法添加了一个空行,但我无法在其中输入文本。我还创建了一个 setCellModifier 来更新 tableviewer。我做错了什么?
代码
Composite tableComposite = new Composite(pluginPathCreatedComposite, SWT.NONE);
FormData tableCompositeData = new FormData();
tableCompositeData.left = new FormAttachment(selectProjectPathLabel, 0, SWT.LEFT);
tableCompositeData.top = new FormAttachment(selectProjectPathLabel, 40, SWT.TOP);
tableCompositeData.right = new FormAttachment(selectProjectPathButton,-10,SWT.LEFT);
tableCompositeData.bottom = new FormAttachment(createProjectConfigButton,-10,SWT.TOP);
tableComposite.setLayoutData(tableCompositeData);
tableViewer = new TableViewer(tableComposite, SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL);
table = tableViewer.getTable();
table.setLinesVisible(true);
table.setHeaderVisible(true);
tableViewer.setColumnProperties(COLUMN_HEADINGS);
//Content provider
tableViewer.setContentProvider(new ProjectConfigTableContentProvider());
/*I have tried to use this instead of setting the label providers in the column definitions*/
//tableViewer.setLabelProvider(new ProjectConfigTableLabelProvider());
//Label provider setted in each column
TableViewerColumn variable = new TableViewerColumn(tableViewer, SWT.NONE);
variable.getColumn().setText(COLUMN_HEADINGS[0]);
variable.getColumn().setResizable(false);
variable.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element) {
if(element instanceof ProjectDirectory && element != null)
return ((ProjectDirectory)element).getName();
return super.getText(element);
}
});
TableViewerColumn path = new TableViewerColumn(tableViewer, SWT.NONE);
path.getColumn().setText(COLUMN_HEADINGS[1]);
path.getColumn().setResizable(false);
path.setLabelProvider(new ColumnLabelProvider(){
public String getText(Object element) {
if(element instanceof ProjectDirectory && element != null)
return ((ProjectDirectory)element).getPath();
return super.getText(element);
}
});
//List created in code (will change this in the future)
List<ProjectDirectory> b = new ArrayList<ProjectDirectory>();
b.add(new ProjectDirectory("AA", "FF"));
b.add(new ProjectDirectory("BB", "CC"));
Project pro = new Project("A", "B", 2, b);
//Input setted
tableViewer.setInput(pro);
TableColumnLayout tableLayout = new TableColumnLayout();
tableComposite.setLayout(tableLayout);
tableLayout.setColumnData(path.getColumn(), new ColumnWeightData(50));
tableLayout.setColumnData(variable.getColumn(), new ColumnWeightData(50));
CellEditor[] editors = new CellEditor[2];
editors[0] = new TextCellEditor(table);
editors[1] = new TextCellEditor(table);
tableViewer.setCellEditors(editors);
tableViewer.setCellModifier(new ProjectConfigTableCellModifier(COLUMN_HEADINGS,tableViewer));
//addrow button
Button addRow = new Button(pluginPathCreatedComposite, SWT.NONE);
FormData addRowData = new FormData();
addRowData.top = new FormAttachment(tableComposite,0,SWT.TOP);
addRowData.left = new FormAttachment(selectProjectPathButton,0,SWT.LEFT);
addRowData.right = new FormAttachment(selectProjectPathButton,0,SWT.RIGHT);
addRow.setLayoutData(addRowData);
addRow.setText("Add");
addRow.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
ProjectDirectory directory = new ProjectDirectory("", "");
tableViewer.add(directory);
table.setTopIndex(table.getItemCount());
table.select(table.getItemCount() - 1);
tableViewer.editElement(directory, 0);
}
});
我还创建了一个 labelProvider 类,以避免像我所做的那样在每列中设置标签提供程序,但它不起作用。代码是这样的:
@Override
public String getColumnText(Object element, int columnIndex) {
// TODO Auto-generated method stub
ProjectDirectory projectDirectory = (ProjectDirectory) element;
switch (columnIndex) {
case 0:
return projectDirectory.getName();
case 1:
return projectDirectory.getPath();
}
return null;
}
对类的调用是这样的:
tableViewer.setLabelProvider(new ProjectConfigTableLabelProvider());
为什么只将标签提供程序设置到列而这种方式不起作用?
【问题讨论】:
-
好吧,你似乎没有为任何东西设置标签提供者——你需要这样做。您似乎也没有在查看器上设置内容提供者或调用
setInput,这也是必需的。要添加/删除内容,您需要更新内容提供者中的“模型”数据,然后告诉查看者这些更改。 -
@greg-449 嗨,我已经按照您给我的建议编辑了代码。我试图直接在列定义中或使用类设置列标签提供程序,并且仅适用于第一种方式。我不明白为什么第二种方法不起作用。我也尝试将单元格设置为 TextCellEditor 但我无法得到它。单击行单元格后,它不会给出写入的选项。
-
使用单独的列标签提供程序并使用
TableViewerColumn.setEditingSupport为每列设置编辑支持类是目前推荐的制作表格的方法。 -
好的,我会尝试那样做,但或多或少我已经设法让它工作了。我不明白为什么我的单元格没有 TextCellEditor 形状,知道吗?
-
当你点击一个单元格时,它会切换到单元格编辑器。