如何删除 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;
}
}
}
});
我创建了一个包含项目类型对象的 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;
}
}
}
});