如何删除 ComboViewer 的元素?

How to delete elements of a ComboViewer?

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

代码

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

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

项目class代码如下:

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

谢谢。

您的选择侦听器中的这些行假设始终有一个选择:

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

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

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

我已经按照 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;
                }
            }
        }
    });