如何在不允许选择的情况下设置JFace TreeViewer?

时间:2012-05-31 08:09:38

标签: java jface rcp treeviewer

创建JFace TreeViewer时,可以使用SWT常量为用户设置允许树项(SWT.SINGLESWT.MULTI)的单个或多个选择。

任何人都可以帮助我,因为我想要一棵树,它的物品根本无法选择吗?我希望它用于预览目的,用户不应该在那里选择项目。

非常感谢,

3 个答案:

答案 0 :(得分:3)

我真的不明白你为什么要压制选择,但这就是它的工作原理:

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

除此之外,我还要确保观众:

  1. 未在部件网站
  2. 中注册为选择提供商
  3. 不接受任何其他ISelectionChangedListeners

答案 1 :(得分:1)

另一个简单的解决方案是将查看器放入单独的复合中,并将其启用状态设置为false:

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

您的查看器现在不会显示为灰色(设置viewer.setEnabled会使其显示为灰色),但用户无法在查看器中选择任何内容。更新和刷新查看器工作得很好。但请记住,现在点击查看器时不会抛出SelectionEvents

答案 2 :(得分:0)

你可以尝试一下吗? 基本上在选择事件上添加过滤器。在Viewer实现的情况下, org.eclipse.jface.util.OpenStrategy类负责触发查看者理解的选择事件。如果在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();
  }
}