Я создал TableViewer с двумя столбцами, и я хочу добавить к нему строки после нажатия кнопки «добавить». После нажатия кнопки я хочу создать пустую строку, в которой ячейка первой колонки предоставит возможность ввести текст, а вторая ячейка столбца предоставит возможность просматривать в системных каталогах для выбора папки.Добавление, редактирование, удаление элементов в TableViewer
Мне удалось добавить пустую строку после нажатия кнопки «Добавить», но она возвращает следующую ошибку: Произошла ошибка. См. Журнал ошибок для получения более подробной информации. утверждение не выполнено: Столбец 0 не имеет поставщика ярлыков. Цель tableviewer - вставить переменную String в ячейку первого столбца и путь во второй ячейке столбца. С данными, вставленными пользователем, я хочу создать список класса под названием 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);
}
}
}
});
Изображение:
EDIT:
Я создал контент-провайдера, чтобы взять ProjectDirectories уплотнительные f a Список, созданный в коде (я буду менять его в будущем). После этого я создал поставщик ярлыков для каждого столбца, и он отображает данные, как я хочу.
Дело в том, что я хочу добавить новую строку в таблицу после нажатия кнопки добавления, и я хочу, чтобы первая ячейка была 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());
Почему работает только настройка поставщиков этикетки на колонке и таким образом doen't работу?
Ну вы, кажется, не у вас есть установленные поставщики ярлыков - вам нужно это сделать. Вы также, похоже, не установили контент-провайдера или не вызвали 'setInput' на просмотрщике, это также необходимо. Чтобы добавить/удалить вещи, вы обновляете данные «модели» в поставщике контента, а затем рассказываете обозревателю об этих изменениях. –
@ greg-449 Привет, я редактировал код с советом, который вы мне дали. Я попытался установить поставщиков меток столбцов непосредственно в определении столбца или в классе, и работает только первым способом. Я не могу понять, почему второй способ не работает. Я также попытался установить ячейки в TextCellEditor, но я не могу их получить. После нажатия на ячейку строки он не должен писать opcion. – Jaime
Использование отдельных поставщиков меток столбцов и использование 'TableViewerColumn.setEditingSupport' для установки класса поддержки редактирования для каждого столбца - рекомендуемый способ делать таблицы в наши дни. –