【问题标题】:SWT Table column offset/paddingSWT 表列偏移/填充
【发布时间】:2018-03-20 19:56:01
【问题描述】:

我有一个包含多个列的 SWT Table。在此示例中,假设有三列。每列的单元格都包含一个图像,后跟一些文本(下图示例)。但是,如您所见,2 - 3 列行与其单元格之间没有间距。

是否有一种内置方法可以向这些单元格添加缓冲区,以便图标不会出现在边缘线上?例如某种偏移属性?我没有看到Table 或TableColumn 中公开列出的任何属性。

如果没有,除了在单元格图像中添加空白之外,还有其他解决方法吗?

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

表:

【问题讨论】:

    标签: java swt


    【解决方案1】:

    我认为没有指定的方法来调整单元格内图像和文本的边距和间距。除了向图像添加透明像素(正如您已经建议的那样)之外,您还可以使用 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,那么还有一个 OwnerDrawLabelProvider,如下例所示: http://www.vogella.com/tutorials/EclipseJFaceTableAdvanced/article.html#styledcelllabelprovider-and-ownerdrawlabelprovider

    【讨论】:

    • 不幸的是,我没有使用 JFace TableViewer,并且设计规范阻止我将图像放置在单元格的右侧。看起来我最好的选择是在图像的左侧插入透明像素。我一直在寻找一种不创建额外句柄的 GC 方法(一些示例显示使用临时透明图像)。您是否偶然知道一种方法或有一个好问题的链接?
    • 你不需要使用 JFace,一个普通的PaintListener 也可以。链接的 SWT Snippet 只是一个示例,您可以将其用作学习如何定位图像的起点。
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多