【问题标题】:How to delete elements of a ComboViewer?如何删除 ComboViewer 的元素?
【发布时间】:2017-03-03 18:22:54
【问题描述】:

我创建了一个包含 Project 类型对象的 ComboViewer。当我选择一个项目时,与 ComboViewer 相同的复合元素的元素会使用选定的项目更新它们的值。当我尝试删除组合框的一个元素时,问题就来了。我使用 setInput 方法更新传递给 ComboViewer 的列表并刷新它。之后,当用户单击组合的元素时,我定义的要管理的 addSelectionListener 事件会自动触发,并且它会检测到该元素为空并抛出 NullPointerException。当我删除一个元素并取下一个元素时,如何删除组合留下的空白空间?

代码

我创建了一个事件来控制何时选择组合框的元素并更新组合的其他元素:

        projectNameTextCombo.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event
                        .getSelection();
                selectedProjectCombo = (Project) selection.getFirstElement(); 
                updateEditionElements(selectedProjectCombo);
            }
        });

我提供了删除 ComboViewer 元素的选项:

    Button deleteProjectConfigButton = new Button(pluginPathCreatedComposite, SWT.NONE);
    deleteProjectConfigButton.addSelectionListener(new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            projectList.getProjectList().remove(selectedProjectCombo);
            projectNameTextCombo.refresh();
        }             

Project类代码如下:

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;
    }

    public Project() {
        super();
        // TODO Auto-generated constructor stub
    }
    //Getters & setters
}

我已经定义了 ComboViewer 标签提供者、内容提供者和 setInput 数据:

    setContentProvider(ArrayContentProvider.getInstance());

    setLabelProvider(new LabelProvider() {
        @Override
        public String getText(Object element) {
            if (element instanceof Project && element != null) {
                Project current = (Project) element;
                return current.getName();
            }
            return super.getText(element);
        }
    }); 

为了填充组合框,我使用了这个函数:

private void populateCombo(){
    if(projectList != null){
        //Returns a Project list
        projectNameTextCombo.setInput(projectList.getProjectList());

        //The first time update other composite elements manually
        projectNameTextCombo.getCombo().select(0);
        selectedProjectCombo = (Project) projectNameTextCombo.getElementAt(0);
        updateEditionElements(selectedProjectCombo);
    }
}

为了更新其他复合元素,我使用了这个函数:

private void updateEditionElements(Project project){
    editProjectPathText.setText(project.getPath());
    projectCompositeViewer.getTable().setEnabled(true);
    projectCompositeViewer.setInput(project);
}

谢谢。

【问题讨论】:

    标签: java eclipse plugins swt jface


    【解决方案1】:

    您的选择监听器中的这些行假设总是有一个选择:

    selectedProjectCombo = (Project) selection.getFirstElement(); 
    updateEditionElements(selectedProjectCombo);
    

    事实并非如此。当您删除条目时,选择将被清除,getFirstElement 将返回 null,因此您需要检查是否确实存在选择:

    selectedProjectCombo = (Project) selection.getFirstElement(); 
    if (selectedProjectCombo != null) {
      updateEditionElements(selectedProjectCombo);
    }
    else {
      // TODO deal with empty selection
    }
    

    【讨论】:

      【解决方案2】:

      我已根据 Greg 的建议设法删除了我的 comboViewer 的元素。

      代码

          projectNameTextCombo.addSelectionChangedListener(new ISelectionChangedListener() {
              public void selectionChanged(SelectionChangedEvent event) {
                  IStructuredSelection selection = (IStructuredSelection) event
                          .getSelection();
                  selectedProjectCombo = (Project) selection.getFirstElement();
                  if (selectedProjectCombo != null) {
                      updateEditionElements(selectedProjectCombo);
                  }
                  else {
                      // Select the 0 position element
                      projectNameTextCombo.getCombo().select(0);
                      //Get the 0 element project of the comboviewer
                      selectedProjectCombo = (Project) projectNameTextCombo.getElementAt(0);
                      //If it is not null, update composite labels, else show information label
                      if(selectedProjectCombo != null){
                          updateEditionElements(selectedProjectCombo);
                      }else{
                          projectCreatedComposite.setVisible(false);
                          projectNotCreatedComposite.setVisible(true);
                          st.topControl = projectNotCreatedComposite;
                      }
                  }
              }
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多