Я пытаюсь выполнить множественный выбор элементов в SWT ListViewer на основе нажатия клавиши Ctrl. Я хочу различать выбор с помощью клавиши Ctrl и простого выбора в ListViewer. Я не могу найти способ увидеть, нажата ли клавиша Ctrl или выпущена. Я не вижу полезного дополнения к этому слушателю. Есть ли способ узнать выбор с помощью нажатия клавиши и отпускания на SWT ListViewer. Вот пример кода, который я пробовал.Как захватить клавишу Ctrl, нажмите и отпустите на 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;
}
}
}
Я не вижу нигде, где вы делаете setInput в ListViewer. –
Поскольку я создаю объект DummyListViewer в другом месте, я устанавливаю ввод после создания объекта DummyListViewer. Но неважно, этот код, похоже, работает. – Juseeth