-1

我已经在树查看器上实现了双击侦听器,下面是我的示例代码片段。

private class DoubleClickListener implements IDoubleClickListener
{
    @Override
    public void doubleClick(final DoubleClickEvent event)
    {
        final IStructuredSelection selection = (IStructuredSelection)event.getSelection();
        if (selection == null || selection.isEmpty())
            return;

        final Object sel = selection.getFirstElement();

        final ITreeContentProvider provider = (ITreeContentProvider)treeViewer.getContentProvider();

        if (!provider.hasChildren(sel))
              return;

        if (treeViewer.getExpandedState(sel))
            treeViewer.collapseToLevel(sel, AbstractTreeViewer.ALL_LEVELS);
        else
            treeViewer.expandToLevel(sel, 1);
    }
}

我现在有一个问题。我从需要双击功能的不同类传递树查看器的对象。因此,除了从不同的类传递树查看器的对象之外,还有一种方法可以使用event.getSource()它返回发生事件的对象吗?我尝试实施它但徒劳无功。有人可以建议如何进行吗?我不想到处使用树查看器的对象,因为event.getSource()返回相应的树查看器的对象。

更新

是的,我同意你的观点,但我不想将树查看器作为参数传递。所以我以这种方式实现了它:

public class doubleClickListener implements IDoubleClickListener
{
    public void doubleClick(DoubleClickEvent event) 
    {
        Object obj = event.getSource();
        if (obj instanceof TreeViewer) 
        {
            TreeViewer eventSrc = (TreeViewer) obj;
            ITreeSelection selec = (ITreeSelection) eventSrc.getSelection();
            if (selec != null && !selec.isEmpty() && selec instanceof IStructuredSelection) 
            {
                IStructuredSelection selection = selec;
                Object item = selection.getFirstElement();              
                if (eventSrc.getExpandedState(item)) 
                {
                    eventSrc.collapseToLevel(item, AbstractTreeViewer.ALL_LEVELS);
                } 
                else 
                {
                    eventSrc.expandToLevel(item, 1);
                }
            }
        }
    }
}

我上面的代码有增强吗?我的意思是创建一个对象ITreeSelection并检查该对象是IStructuredSelection正确的方法吗?如果不是,检查 instanceof 的正确方法是IStructuredSelection什么?

4

1 回答 1

0

只需将树查看器作为参数传递给双击构造函数:

public class DoubleClickListener implements IDoubleClickListener
{
   // The tree viewer to work with
   private final TreeViewer treeViewer;


   public DoubleClickListener(TreeViewer viewer)
   {
     treeViewer = viwer;
   }

   ... no change needed to doubleClick code
}

要使用:

treeViewer.addDoubleClickListener(new DoubleClickListener(treeViewer));

更新:

或者,该DoubleClickEvent getSource()方法将是TreeViewer(只要侦听器安装在树查看器上!)。

于 2014-04-03T06:54:48.787 回答