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;
}
}
}
Ich sehe nirgendwo, wo Sie eine setInput auf dem ListViewer tun. –
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