簡體   English   中英

SWT雙擊展開

[英]SWT double-click expansion

我在樹查看器上實現了一個雙擊偵聽器,我的示例代碼片段如下。

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的正確方法是什么?

只需將樹查看器作為參數傳遞給雙擊構造函數:

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 (只要偵聽器安裝在樹查看器上!)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM