Как установить JFace TreeViewer без возможности выбора?

При создании JFace TreeViewer можно использовать константы SWT для установки одного или нескольких вариантов выбора, разрешенных пользователю для элементов дерева (SWT.SINGLE или SWT.MULTI).

Может ли кто-нибудь помочь мне, пожалуйста, так как я хочу дерево, чтобы его элементы вообще нельзя было выбрать? Я хочу, чтобы это было для предварительного просмотра, и пользователь не должен иметь возможность выбирать там элемент.

Спасибо заранее,


person mobaisch    schedule 31.05.2012    source источник


Ответы (3)


Я действительно не понимаю, почему вы хотите подавить выбор, но вот как это может работать:

viewer.addSelectionChangedListener(new ISelectionChangedListener() {
    @Override
    public void selectionChanged(final SelectionChangedEvent event) {
        if (!event.getSelection().isEmpty()) {
             v.setSelection(StructuredSelection.EMPTY);
        }
    }
});

В дополнение к этому я бы удостоверился, что зритель:

  1. не зарегистрирован в качестве поставщика выбора на сайте детали
  2. не принимает никаких других ISelectionChangedListeners
person Ilya Shinkarenko    schedule 31.05.2012
comment
Спасибо ... это долгая история, чтобы объяснить, но я нахожусь в ситуации, когда мне это очень нужно и необходимо, это для предварительного просмотра дерева, когда выбор может быть неправильно понят пользователем, и я не мог использовать что-то еще как Я извлекаю этот древовидный просмотрщик из другого большего древовидного просмотра .. еще раз спасибо - person mobaisch; 31.05.2012

Еще одно простое решение — поместить средство просмотра в отдельный композит и установить для него включенное состояние в false:

Composite c = new Composite(parent, SWT.NONE);
TreeViewer viewer = new TreeViewer(c, SWT.Border);
c.setEnabled(false);

Ваше средство просмотра теперь НЕ будет отображаться серым (настройка viewer.setEnabled сделает его серым), но пользователь не сможет ничего выбрать в средстве просмотра. Обновление и освежение вьювера работает нормально. Но имейте в виду, что теперь при щелчке в окне просмотра не будет выдаваться SelectionEvents.

person David    schedule 21.08.2013

Не могли бы вы попробовать это? В основном добавление фильтра для событий выбора. В случае реализации Viewer класс org.eclipse.jface.util.OpenStrategy отвечает за запуск событий выбора, которые понимает Viewer. Если фильтр добавлен к событию выбора SWT, Viewer никогда не узнает о базовом выборе.

public class SWTSimpleTree {
  Display display = new Display();
  Shell shell = new Shell(display);

  Tree tree;
  private Listener filter = new Listener() {

    @Override
    public void handleEvent(Event event) {

      event.type=SWT.None;
      event.doit=false;
      event.item = null;
      tree.deselectAll();
    }
  };

  public SWTSimpleTree() {
    shell.setLayout(new GridLayout());

    tree = new Tree(shell, SWT.BORDER);


    tree.setLayoutData(new GridData(GridData.FILL_BOTH));

    TreeItem item = new TreeItem(tree, SWT.NULL);
    item.setText("ITEM");

    TreeItem item2 = new TreeItem(item, SWT.NULL);
    item2.setText("ITEM2");

    TreeItem item3 = new TreeItem(item2, SWT.NULL);

    item3.setText("ITEM3");

    System.out.println("item: " + item.getParent() + ", " + item.getParentItem());
    System.out.println("item2: " + item2.getParent() + ", " + item2.getParentItem());

    System.out.println(tree.getItemCount());
    System.out.println(tree.getItems().length);

    tree.getDisplay().addFilter(SWT.Selection, filter);
    tree.getDisplay().addFilter(SWT.DefaultSelection, filter);


    shell.setSize(300, 200);
    shell.open();
    //textUser.forceFocus();

    // Set up the event loop.
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        // If no more entries in event queue
        display.sleep();
      }
    }

    display.dispose();
  }

  private void init() {

  }

  public static void main(String[] args) {
    new SWTSimpleTree();
  }
}
person sambi reddy    schedule 01.06.2012