2016-10-14 4 views
0

Я создал 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); 
       } 
      } 
     } 
    }); 

Изображение:

UI

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 работу?

+1

Ну вы, кажется, не у вас есть установленные поставщики ярлыков - вам нужно это сделать. Вы также, похоже, не установили контент-провайдера или не вызвали 'setInput' на просмотрщике, это также необходимо. Чтобы добавить/удалить вещи, вы обновляете данные «модели» в поставщике контента, а затем рассказываете обозревателю об этих изменениях. –

+0

@ greg-449 Привет, я редактировал код с советом, который вы мне дали. Я попытался установить поставщиков меток столбцов непосредственно в определении столбца или в классе, и работает только первым способом. Я не могу понять, почему второй способ не работает. Я также попытался установить ячейки в TextCellEditor, но я не могу их получить. После нажатия на ячейку строки он не должен писать opcion. – Jaime

+0

Использование отдельных поставщиков меток столбцов и использование 'TableViewerColumn.setEditingSupport' для установки класса поддержки редактирования для каждого столбца - рекомендуемый способ делать таблицы в наши дни. –

ответ

1

Хорошо, я нашел решение моей проблемы.

Прежде всего, я создал композит, который будет содержать таблицу внутри большего композита.

 private Composite createPluginPathCreatedComposite(){ 

     ................................. 

     //Label of bigger composite 
     Text selectProjectPathText = new Text(pluginPathCreatedComposite, SWT.BORDER); 
     selectProjectPathText.setEnabled(false); 
     FormData selectProjectPathTextData = new FormData(); 
     selectProjectPathTextData.top = new FormAttachment(selectProjectPathLabel, 0, SWT.CENTER); 
     selectProjectPathTextData.left = new FormAttachment(selectProjectPathLabel, 5,SWT.RIGHT); 
     selectProjectPathTextData.right = new FormAttachment(100,-55); 
     selectProjectPathText.setLayoutData(selectProjectPathTextData); 

     //Button to select a system directory 
     Button selectProjectPathButton = new Button(pluginPathCreatedComposite, SWT.NONE); 
     selectProjectPathButton.setText("Browse"); 
     FormData selectProjectPathButtonData = new FormData(); 
     selectProjectPathButtonData.top = new FormAttachment(selectProjectPathText, 0, SWT.TOP); 
     selectProjectPathButtonData.left = new FormAttachment(selectProjectPathText, 5, SWT.RIGHT); 
     selectProjectPathButtonData.right = new FormAttachment(100,-5); 
     selectProjectPathButton.setLayoutData(selectProjectPathButtonData); 
     selectProjectPathButton.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent e) { 
       DirectoryDialog dialog = new DirectoryDialog(Display.getCurrent().getActiveShell()); 
       dialog.setFilterPath(""); // Windows specific 
       selectProjectPathText.setText(dialog.open()); 
      } 
     }); 

     //Create a composite for the table inside a bigger composite pluginPathCreatedComposite 
     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); 

     //Function to create the table. 
     createTable(tableComposite,selectProjectPathText); 

     //add row to the tableviewer 
     addRow.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent e) { 
       ProjectDirectory directory = new ProjectDirectory("Insert variable", "Click to add path"); 
       projectCompositeViewer.add(directory); 
      } 
     }); 

     //deleterow from the tableviewer 
     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 = projectCompositeViewer.getSelection(); 
       if (selection instanceof IStructuredSelection) { 
        Iterator iterator = ((IStructuredSelection) selection).iterator(); 
        while (iterator.hasNext()) { 
         Object obj = iterator.next(); 
         projectCompositeViewer.remove(obj); 
        } 
       } 
      } 
     }); 
     } 

Создать табличную функцию, я прошел таблицу Composite и путь к папке project's в качестве параметра:

private void createTable(Composite tableComposite, Text selectProjectPathText){ 
     //Create the tableViewer and it´s columns 
     projectCompositeViewer = new ProjectConfigViewer(tableComposite, selectProjectPathText,SWT.SINGLE | SWT.FULL_SELECTION | SWT.H_SCROLL | SWT.V_SCROLL); 

     //Create an input to display 
     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); 
     projectCompositeViewer.setInput(pro); 
    } 

ProjectConfigViewer код:

public class ProjectConfigViewer extends TableViewer{ 

    public ProjectConfigViewer(Composite parent, Text selectProjectPathText,int style) 
    { 
     super(parent, style); 
     Table table = getTable(); 
     createColumns(parent, selectProjectPathText); 
     table.setHeaderVisible(true); 
     table.setLinesVisible(true); 

     //Specify Content provider 
     setContentProvider(new ProjectConfigTableContentProvider()); 
    } 

    //Create the columns, column´s label providers and editingsuport to specify how will each column cell be: text column, dialog column... 
    private void createColumns(Composite parent,Text selectProjectPathText) 
    { 
     String[] COLUMN_HEADINGS = {"Variable", "Path"}; 

     TableColumnLayout tableLayout = new TableColumnLayout(); 
     parent.setLayout(tableLayout); 

     //Specify first column labelprovider and create it 
     TableViewerColumn variable = createTableViewerColumn(COLUMN_HEADINGS[0], 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); 
      } 
     }); 

     //Specify second column labelprovider and create it 
     TableViewerColumn path = createTableViewerColumn(COLUMN_HEADINGS[1], 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); 
      } 
     }); 

     //Spedify the dimensions of each column 
     tableLayout.setColumnData(path.getColumn(), new ColumnWeightData(50)); 
     tableLayout.setColumnData(variable.getColumn(), new ColumnWeightData(50)); 

     //Specify setEditingSupport for each cell. First cell will be text, second will be a Dialog. 
     variable.setEditingSupport(new ProjectConfigVariableEditingSupport(this)); 
     path.setEditingSupport(new ProjectConfigPathEditingSupport(this, selectProjectPathText)); 
    } 

    //Create tableviewercolumns 
    private TableViewerColumn createTableViewerColumn(String header, int idx) 
    { 
     TableViewerColumn column = new TableViewerColumn(this, SWT.LEFT, idx); 
     column.getColumn().setText(header); 
     column.getColumn().setResizable(true); 
     column.getColumn().setMoveable(true); 

     return column; 
    } 
} 

Контент-провайдер:

public class ProjectConfigTableContentProvider implements IStructuredContentProvider { 
    private List<ProjectDirectory> projectEntitiesList; 

    @Override 
    public Object[] getElements(Object arg0) { 
     // TODO Auto-generated method stub 
     if (arg0 instanceof Project){ 
      Project project = (Project) arg0; 
      if (project != null && project.getProjectDirectoriesList() != null){ 
       initializeTableProjectConfig(project); 
       return projectEntitiesList.toArray(); 
      } 
     } 
     projectEntitiesList = new ArrayList<ProjectDirectory>(); 
     return projectEntitiesList.toArray(); 
    } 

    private void initializeTableProjectConfig(Project project){ 
     try { 
      List<ProjectDirectory> listProjectDirectory = new ArrayList<ProjectDirectory>(); 
      for (ProjectDirectory projectDirectory : project.getProjectDirectoriesList()) { 
       if (projectDirectory != null) 
        listProjectDirectory.add(projectDirectory); 
      } 
      this.projectEntitiesList = listProjectDirectory; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

EditingSupport первой колонки:

public class ProjectConfigVariableEditingSupport extends EditingSupport { 
    private TextCellEditor cellEditor; 

    public ProjectConfigVariableEditingSupport(ColumnViewer viewer) { 
     super(viewer); 
     cellEditor = new TextCellEditor(((TableViewer)viewer).getTable()); 
    } 
    protected CellEditor getCellEditor(Object element) { 
     return cellEditor; 
    } 
    protected boolean canEdit(Object element) { 
     return true; 
    } 
    protected Object getValue(Object element) { 
     return ((ProjectDirectory) element).getName(); 
    } 
    @Override 
    protected void setValue(Object element, Object value) { 
     ((ProjectDirectory) element).setName(String.valueOf(value)); 
     getViewer().update(element, null); 
    } 
} 

Editng поддержка второго столбца:

public class ProjectConfigPathEditingSupport extends EditingSupport{ 
    private DialogCellEditor cellEditor; 

    //Pass selecProjectPathText of the bigger composite to brose from that directory 
    public ProjectConfigPathEditingSupport(ColumnViewer viewer, Text selectProjectPathText) { 
     super(viewer); 
     cellEditor = new DialogCellEditor(((TableViewer)viewer).getTable()) { 
      @Override 
      protected Object openDialogBox(Control cellEditorWindow) { 
       // TODO Auto-generated method stub 
       DirectoryDialog dialog = new DirectoryDialog(cellEditorWindow.getShell()); 
       dialog.setText("Browse"); 
       dialog.setFilterPath(selectProjectPathText.getText()); // Windows specific 
       return dialog.open(); 
      } 
     }; 
    } 
    protected CellEditor getCellEditor(Object element) { 
     return cellEditor; 
    } 
    protected boolean canEdit(Object element) { 
     return true; 
    } 
    protected Object getValue(Object element) { 
     return ((ProjectDirectory) element).getPath(); 
    } 
    protected void setValue(Object element, Object value) 
    { 
     ((ProjectDirectory) element).setPath(String.valueOf(value)); 
     getViewer().update(element, null); 
    } 
} 

классов Model:

public class Project { 
    private String name; 
    private String path; 
    private Integer quantity; 
    private List<ProjectDirectory> projectDirectoryList; 

    //Constructor 
    public Project(String name, String path, Integer quantity, List<ProjectDirectory> projectDirectoriesList) { 
     super(); 
     this.name = name; 
     this.path = path; 
     this.quantity = quantity; 
     this.projectDirectoryList = projectDirectoriesList; 
    } 
    //GETTERS AND SETTERS 
} 

public class ProjectDirectory { 
    private String name; 
    private String path; 

    //Constructor 
    public ProjectDirectory(String name, String path) { 
     super(); 
     this.path = path; 
     this.name = name; 
    } 

    //Getters & setters 

Фотографии: Explanation of use

Смежные вопросы