SWT表列偏移/填充

时间:2017-10-09 14:50:27

标签: java swt

我有一个包含多列的SWT elementsArray = []; addElementList(event) { let element = event.data; if (!this.elementsArray.includes(element)) { this.elementsArray.push(element); console.log("Elements in array = " + this.elementsArray); } } removeElementList(event) { let element = event.data; let index = this.elementsArray.indexOf(element, 0); if (index > -1) { this.elementsArray.splice(index, 1); console.log("Elements in array = " + this.elementsArray); } } 。在这个例子中,我们说有三列。每列的单元格都包含一个图像,后面跟着一些文本(如下图所示)。但是,正如您所看到的,2 - 3列线和它们的单元格之间没有间距。

是否有内置方法为这些单元格添加缓冲区,因此图标不会出现在边缘线上?比如某种偏移属性?我没有在TableTable中看到任何明显列出的财产。

如果没有,除了向单元格图像添加空格外还有一种解决方法吗?

如果我能做些什么可以让我的问题更清楚,请告诉我。

表:

table

1 个答案:

答案 0 :(得分:2)

我认为没有指定的方法来调整单元格内图像和文本的边距和间距。除了向图像添加透明像素(如您所建议的那样)之外,您还可以使用PaintListener来控制单元格的渲染方式。

以下示例绘制具有可调边距和间距的图像和文本:

Listener paintListener = new Listener() {
  int leftMargin = 40;
  int rightMargin = 10;
  int imageSpacing = 200;
  @Override
  public void handleEvent( Event event ) {
    TableItem item = ( TableItem )event.item;
    Rectangle imageBounds = image.getBounds();
    Point textExtent = event.gc.textExtent( item.getText() );
    switch( event.type ) {
      case SWT.MeasureItem: {
        event.width += leftMargin + imageBounds.width + imageSpacing + textExtent.x + rightMargin;
        event.height = Math.max( event.height, imageBounds.height + 2 );
        event.height = Math.max( event.height, textExtent.y + 2 );
        break;
      }
      case SWT.PaintItem: {
        int x = event.x + leftMargin;
        int imageOffset = ( event.height - imageBounds.height ) / 2;
        event.gc.drawImage( image, x, event.y + imageOffset );
        x += imageSpacing;
        int textOffset = ( event.height - textExtent.y ) / 2;
        event.gc.drawText( item.getText(), x, event.y + textOffset );
        break;
      }
      case SWT.EraseItem: {
        event.detail &= ~SWT.FOREGROUND;
      }
    }
  }
};
table.addListener( SWT.MeasureItem, paintListener );
table.addListener( SWT.PaintItem, paintListener );
table.addListener( SWT.EraseItem, paintListener );

要更全面地了解SWT中所有者绘制的项目,请阅读Custom Drawing Table and Tree Items文章。

如果您使用的是JFace TableViewer,则此示例中还会显示OwnerDrawLabelProviderhttp://www.vogella.com/tutorials/EclipseJFaceTableAdvanced/article.html#styledcelllabelprovider-and-ownerdrawlabelprovider