滚动时SWT Treeviewer闪烁

时间:2017-12-01 14:28:33

标签: treeview swt

我有一个带自定义labelprovider的SWT Treeviewer。但即使它不是很大,它在滚动时也会闪烁。我认为这是因为绘画方法。我怎样才能提高它的性能。 先感谢您。 这是我的绘画方法:

public class TreeLabelProvider extends OwnerDrawLabelProvider {

public ImageData[] getImage(Object element) {
  //This function just have if else to return corrent imageData
}

public String getText(Object element) {

 //This function also just have if else to return matching text to display
}

@Override
protected void measure(Event event, Object element) {
    TreeItem item = (TreeItem) event.item;
    Tree tree = item.getParent();

    ImageData[] images = getImage(element);
    int imgWidht = 0;
    int imgHeight = 0;
    if (images != null) {
        for (int i = 0; i < images.length; i++) {
            imgWidht += images[i].width;

            int imgHeightTemp = images[i].height;

            if (imgHeightTemp > imgHeight) {
                imgHeight = imgHeightTemp;
            }
        }
    }
    if (!event.gc.isDisposed()) {

            Point point = event.gc.textExtent(getText(element));
            int rectangleWidth = 0;
            rectangleWidth = imgWidht + point.x + 10;

            event.setBounds(new Rectangle(event.x, event.y, rectangleWidth, imgHeight));
            event.height = imgHeight + 3;

    }
}

@Override
protected void paint(Event event, Object element) {


    Rectangle bounds = event.getBounds();

    int imgWidth = 0;

    int x = bounds.width > 0 ? bounds.x + bounds.width : bounds.x;

    ImageData[] img = getImage(element);
    if (img != null) {
        for (int imgIndex = 0; imgIndex < img.length; imgIndex++) {
            event.gc.setAntialias(SWT.ON);
            // make the image transparent
            ImageData ideaData = img[imgIndex];

            int whitePixel = ideaData.palette.getPixel(new RGB(255, 255, 255));
            ideaData.transparentPixel = whitePixel;
            Image transparentIdeaImage = new Image(Display.getDefault(), ideaData);
            if (imgIndex > 0) {
                event.gc.drawImage(transparentIdeaImage,
                        x + transparentIdeaImage.getBounds().width - 4, bounds.y + 2);
            } else {
                event.gc.drawImage(transparentIdeaImage, x - 5, bounds.y + 2);
            }
            imgWidth += transparentIdeaImage.getBounds().width;

            // dispose Image
            transparentIdeaImage.dispose();
        }
    }

event.gc.drawText(getText(element), x + imgWidth + 1, bounds.y + 3, true);


}

@Override
protected void erase(Event event, Object element) {}
}

0 个答案:

没有答案