【发布时间】: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