2016-04-05 6 views
0

Ich versuche, eine Mehrfachauswahl von Elementen auf SWT ListViewer basierend auf Strg-Taste drücken. Ich möchte zwischen Auswahl mit Strg-Taste und einfacher Auswahl auf dem ListViewer unterscheiden. Ich finde keine Möglichkeit herauszufinden, ob die Strg-Taste gedrückt oder losgelassen wird. Ich sehe keinen hilfreichen Listener dazu. Gibt es eine Möglichkeit, die Auswahl per Tastendruck auf SWT ListViewer zu erfahren? Hier ist der Beispielcode, den ich ausprobiert habe.So erfassen Sie Strg-Taste drücken und loslassen auf SWT ListViewer

public class DummyListViewer { 

private ListViewer dummyViewer; 

    public DummyListViewer (Composite parent) { 
      dummyViewer = createListViewer(parent); 
     } 

     private ListViewer createListViewer(Composite parent) { 
      GridData data = new GridData(SWT.LEFT, SWT.LEFT, false, false); 
      ScrolledComposite scrolledParent = (ScrolledComposite) createScrolledComposite(parent, SWT.NONE); 
      final ListViewer dummyViewer= new ListViewer(scrolledParent, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL| SWT.MULTI); 
      dummyViewer.getList().addKeyListener(new CtrlKeyListener()); 
      dummyViewer.setContentProvider(new ListViewerContentProvider()); 
      dummyViewer.setLabelProvider(new ListViewerLabelProvider()); 
      scrolledParent.setContent(dummyViewer.getControl()); 
      scrolledParent.setMinSize(dummyViewer.getControl().computeSize(SWT.DEFAULT, SWT.DEFAULT)); 
      dummyViewer.getControl().setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true)); 
      return dummyViewer; 
     } 

     private Composite createScrolledComposite(Composite parent, int style) { 
      ScrolledComposite scrolledComposite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL); 
      scrolledComposite.setLayout(new GridLayout(1, false)); 
      GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true); 
      gridData.widthHint = 400; 
      gridData.heightHint = 700; 
      scrolledComposite.setLayoutData(gridData); 
      scrolledComposite.setExpandVertical(true); 
      scrolledComposite.setExpandHorizontal(true); 
      return scrolledComposite; 
     } 

     public void setInput(List<Object> input) { 
      filterViewer.setInput(input); 
     } 

     private class ListViewerContentProvider implements IStructuredContentProvider { 

      @Override 
      public void dispose() { 

      } 

      @Override 
      public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 

      } 

      @Override 
      public Object[] getElements(Object inputElement) { 
       if (inputElement instanceof List) { 
        return ((List)inputElement).toArray(); 
       } 
       return null; 
      } 

     } 

     private ColumnViewerFilter filter; 



     private class ColumnViewerFilter extends ViewerFilter { 

      String value=""; //$NON-NLS-1$ 

      /** 
      * Constructor for ColumnViewerFilter to set the String on which 
      * the viewer has to be filtered on. 
      * @param value - String on which 
      * the viewer has to be filtered on. 
      */ 
      public ColumnViewerFilter(String value) { 
       this.value = value; 
      } 

      @Override 
      public boolean select(Viewer viewer, Object parentElement, Object element) { 
       if (value != null && value instanceof String && element instanceof String) { 
        if (value.equals(element)) 
         return true; 
       } 
       return false; 
      } 

     } 

     private class ListViewerLabelProvider extends ColumnLabelProvider { 

      @Override 
      public String getText(Object element) { 
       if(element instanceof String) 
        return (String)element; 
       return null; 
      } 

     } 



     private boolean CtrlkeyPressed = false; 
     private class CtrlKeyListener implements KeyListener{ 

      @Override 
      public void keyPressed(KeyEvent e) { 
      if (e.keyCode == SWT.CTRL) 
       CtrlkeyPressed = true; 

      } 

      @Override 
      public void keyReleased(KeyEvent e) { 
       if (e.keyCode == SWT.CTRL) 
       CtrlkeyPressed = false; 
      } 

     } 
    } 
+0

Ich sehe nirgendwo, wo Sie eine setInput auf dem ListViewer tun. –

+0

Während ich ein DummyListViewer-Objekt an anderer Stelle erstelle, setze ich die Eingabe nach dem Erstellen des DummyListViewer-Objekts. Aber egal, der Code scheint zu funktionieren. – Juseeth

Antwort

0

Sie zu Schlüsselereignis hören in den ListViewer enthaltenen addKeyListener auf der List Steuerung mit:

viewer.getList().addKeyListener(new KeyListener() { 

    @Override 
    public void keyPressed(final KeyEvent e) 
    { 
    if (e.keyCode == SWT.CTRL) 
     // TODO control pressed 
    } 

    @Override 
    public void keyReleased(final KeyEvent e) 
    { 
    if (e.keyCode == SWT.CTRL) 
     // TODO control release 
    } 

}); 

Beachten Sie, dass auf einigen Plattformen Mehrfachauswahl nicht die Ctrl Schlüssel verwendet. Auf dem Mac wird der Schlüssel ÷ verwendet().

+0

Ich habe versucht, dies hinzuzufügen, aber es wird nicht aufgerufen. – Juseeth

+0

Funktioniert für mich. Bearbeiten Sie Ihre Frage und fügen Sie Ihren Code hinzu. –

+0

Ich habe meinen Code hinzugefügt. – Juseeth