2012-05-31 2 views
0

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

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

Большое спасибо заранее,

ответ

3

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

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

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

  1. не зарегистрирован в качестве поставщика выбора в сайте Пярта
  2. не принимает никаких других ISelectionChan gedListeners
+0

Спасибо .. это долгая история, чтобы объяснить, но я в ситуации, когда мне было нужно это очень плохо и необходимо, это для древовидной «превью» цели, где выбор может быть неправильно понят пользователем, и я мог бы не использовать что-то еще, поскольку я извлекаю этот treeviewer из другого более крупного дерева. – mobaisch

0

Не могли бы вы попробовать это? В основном добавление фильтра на события выбора. В случае реализации 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(); 
    } 
} 
1

Другим простым решением является поставить зрителя в отдельный композит и установить разрешенное состояние его ложь:

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

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