2

我有一个TreeViewer带有 SWTTree底层的 JFace,我正在为自己的多行支持绘制单元格。目前,它看起来像这样:

普通的

我希望展开图标和标签都像这样降低:

降低

这对标签来说没有问题,因为我正在扩展并StyledCellLabelProvider覆盖- 问题是我不知道是否可以为展开图标设置 Y 坐标。恐怕不是……如果是这样,我也想为自己绘制一个自定义展开图标,但还有一点:是否有可能完全消失本机展开图标?我在and方法中都试过了,但没有奏效:paint()measure()measure()paint()

event.detail &= ~SWT.FOREGROUND;
4

1 回答 1

1

我刚刚在 Tree 上添加了简单的绘制方法。这应该可以帮助您找到方向

public class Snippet {public static void main (String [] args) {
    Display display = new Display ();
    Shell shell = new Shell (display);
    shell.setLayout(new FillLayout());
    final Tree tree = new Tree (shell, SWT.BORDER);
    for (int i=0; i<4; i++) {
        TreeItem iItem = new TreeItem (tree, 0);
        iItem.setText ("TreeItem (0) -" + i);
        for (int j=0; j<4; j++) {
            TreeItem jItem = new TreeItem (iItem, 0);
            jItem.setText ("TreeItem (1) -" + j);
            for (int k=0; k<4; k++) {
                TreeItem kItem = new TreeItem (jItem, 0);
                kItem.setText ("TreeItem (2) -" + k);
                for (int l=0; l<4; l++) {
                    TreeItem lItem = new TreeItem (kItem, 0);
                    lItem.setText ("TreeItem (3) -" + l);
                }
            }
        }
    }

    tree.addListener(SWT.PaintItem, new Listener() {

        @Override
        public void handleEvent(Event event) {
            GC gc = event.gc;
            TreeItem item = (TreeItem) event.item;
            Tree tree = (Tree) event.widget;
            Rectangle rect = tree.getClientArea();
            Rectangle bounds = item.getBounds();

            /**
             * expand/collapse native control bounds
             */

             TreeItem  parentItem= item.getParentItem();

             Rectangle ecb = null;
             if(parentItem != null){
                 Rectangle pBounds = parentItem.getBounds();
                 ecb = new Rectangle(pBounds.x, bounds.y, Math.abs(pBounds.x-bounds.x), bounds.height);
             }
             else
             {
                 ecb = new Rectangle(rect.x, bounds.y, Math.abs(rect.x-bounds.x), bounds.height);
             }

            gc.setAlpha(200);

            /**
             * paint image in this bounds depending on state
             * testing purpose: filling background
             */
            if(item.getExpanded()){
                gc.setBackground(event.display.getSystemColor(SWT.COLOR_RED));
                gc.fillRectangle(ecb.x,ecb.y,ecb.width,ecb.height);
            }
            else
            {
                gc.setBackground(event.display.getSystemColor(SWT.COLOR_CYAN));
                gc.fillRectangle(ecb.x,ecb.y,ecb.width,ecb.height);
            }
        }
    });
    shell.setSize (200, 200);
    shell.open ();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch ()) display.sleep ();
    }
    display.dispose ();
}
} 

您需要绘制展开/折叠图像而不是填充背景

在此处输入图像描述

于 2013-05-30T19:35:34.290 回答