2016-10-21 4 views
0

Ich habe einen ComboViewer erstellt, der Projekttypobjekte enthält. Wenn ich ein Projekt auswähle, aktualisieren die Elemente desselben Composites wie der ComboViewer ihre Werte mit den ausgewählten Project-Elementen. Das Problem tritt auf, wenn ich versuche, ein Element der Combobox zu löschen. Ich aktualisiere die Liste, die ich mit der Methode setInput an den ComboViewer übergebe, und aktualisiere sie. Danach löst das addSelectionListener-Ereignis, das ich zu verwalten habe, wenn der Benutzer auf ein Element der Combo klickt, automatisch aus und erkennt, dass das Element null ist und eine NullPointerException verursacht. Wie kann ich den leeren Raum löschen, den die Combo beim Löschen eines Elements verlässt und den nächsten nehme?Wie lösche ich Elemente eines ComboViewers?

-Code

ich ein Ereignis erstellt haben, zu steuern, wenn ein Element der Combobox ausgewählt und die anderen Elemente des Verbund zu aktualisieren:

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

ich die Möglichkeit gegeben haben, zu löschen ComboViewer Element:

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

der Code Projektklasse ist folgende:

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 
} 

Ich habe den ComboViewer Label-Anbieter, die Inhaltsanbieter und die setInput Daten definiert:

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

den Combobox So füllt Ich benutze diese Funktion:

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

und die andere zu aktualisieren Verbundelemente Ich nutze diese Funktion:

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

Danke.

Antwort

0

ich verwendet habe Greg's Rat die Elemente meiner löschen zu verwalten ComboViewer.

-Code

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

Diese Zeilen in Ihrer Auswahl Zuhörern davon aus, dass es immer eine Auswahl ist:

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

Dies ist nicht der Fall. Wenn Sie einen Eintrag löschen die Auswahl gelöscht und getFirstElement wird null zurückkehren, so müssen Sie überprüfen, dass es tatsächlich eine Auswahl ist:

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