Eclipse:表列图像是否透明?

发布于 2024-08-15 16:17:03 字数 2610 浏览 6 评论 0原文

一旦我开始在 Eclipse 表格单元格中绘制自己的图像,突出显示该表格单元格就会产生奇怪的突出显示颜色。亲自查看:

alt text

虽然透明度实际上像第一列中一样保留,但突出显示蓝色没有应有的蓝色。这是我的错还是 Eclipse 的错?

这是代码片段:

public class TransparentOrNot {

  public static void main(String[] args) {
    Display firstDisplay = new Display();
    Shell firstShell = new Shell(firstDisplay);
    firstShell.setText("Transparent-or-not!");
    firstShell.setSize(300, 200);
    firstShell.setLayout(new FillLayout());

    TableViewer viewer = new TableViewer(firstShell, SWT.MULTI);
    viewer.getTable().setLinesVisible(true);
    viewer.getTable().setHeaderVisible(true);

    TableViewerColumn tableViewerColumn = new TableViewerColumn(viewer, SWT.CENTER);
    tableViewerColumn.getColumn().setText("First");
    tableViewerColumn.getColumn().setWidth(150);
    tableViewerColumn.setLabelProvider(new ColumnLabelProvider() {

      @Override
      public Image getImage(Object element) {
        return ImageDescriptor.createFromFile(TransparentOrNot.class, "/red.png").createImage();
      }

      @Override
      public String getText(Object element) {
        return null;
      }
    });
    tableViewerColumn = new TableViewerColumn(viewer, SWT.CENTER);
    tableViewerColumn.getColumn().setText("Second");
    tableViewerColumn.getColumn().setWidth(150);
    tableViewerColumn.setLabelProvider(new CenterImageLabelProvider());
    viewer.setContentProvider(ArrayContentProvider.getInstance());

    viewer.setInput(new String[][]{{"a", "b"}, {"c", "d"}});

    firstShell.open();
    while (!firstShell.isDisposed()) {
      if (!firstDisplay.readAndDispatch()) {
        firstDisplay.sleep();
      }
    }
    firstDisplay.dispose();
  }

  static class CenterImageLabelProvider extends OwnerDrawLabelProvider {

    @Override
    protected void measure(Event event, Object element) {
      // no-op
    }

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

      Image image = ImageDescriptor.createFromFile(TransparentOrNot.class, "/green.png").createImage();

      Widget item = event.item;
      Rectangle bounds = ((TableItem) item).getBounds(event.index);

      Rectangle imgBounds = image.getBounds();
      bounds.width /= 2;
      bounds.width -= imgBounds.width / 2;
      bounds.height /= 2;
      bounds.height -= imgBounds.height / 2;

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

      event.gc.drawImage(image, x, y);
    }
  }
}

Once I start drawing my own images in an Eclipse table cell, highlighting that table cell results in a strange highlight color. See for yourself:

alt text

While the transparency is actually preserved like in the first column, the highlight-blue isn't as blue as it should. Is this my fault or Eclipse's fault?

Here's the code snippet:

public class TransparentOrNot {

  public static void main(String[] args) {
    Display firstDisplay = new Display();
    Shell firstShell = new Shell(firstDisplay);
    firstShell.setText("Transparent-or-not!");
    firstShell.setSize(300, 200);
    firstShell.setLayout(new FillLayout());

    TableViewer viewer = new TableViewer(firstShell, SWT.MULTI);
    viewer.getTable().setLinesVisible(true);
    viewer.getTable().setHeaderVisible(true);

    TableViewerColumn tableViewerColumn = new TableViewerColumn(viewer, SWT.CENTER);
    tableViewerColumn.getColumn().setText("First");
    tableViewerColumn.getColumn().setWidth(150);
    tableViewerColumn.setLabelProvider(new ColumnLabelProvider() {

      @Override
      public Image getImage(Object element) {
        return ImageDescriptor.createFromFile(TransparentOrNot.class, "/red.png").createImage();
      }

      @Override
      public String getText(Object element) {
        return null;
      }
    });
    tableViewerColumn = new TableViewerColumn(viewer, SWT.CENTER);
    tableViewerColumn.getColumn().setText("Second");
    tableViewerColumn.getColumn().setWidth(150);
    tableViewerColumn.setLabelProvider(new CenterImageLabelProvider());
    viewer.setContentProvider(ArrayContentProvider.getInstance());

    viewer.setInput(new String[][]{{"a", "b"}, {"c", "d"}});

    firstShell.open();
    while (!firstShell.isDisposed()) {
      if (!firstDisplay.readAndDispatch()) {
        firstDisplay.sleep();
      }
    }
    firstDisplay.dispose();
  }

  static class CenterImageLabelProvider extends OwnerDrawLabelProvider {

    @Override
    protected void measure(Event event, Object element) {
      // no-op
    }

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

      Image image = ImageDescriptor.createFromFile(TransparentOrNot.class, "/green.png").createImage();

      Widget item = event.item;
      Rectangle bounds = ((TableItem) item).getBounds(event.index);

      Rectangle imgBounds = image.getBounds();
      bounds.width /= 2;
      bounds.width -= imgBounds.width / 2;
      bounds.height /= 2;
      bounds.height -= imgBounds.height / 2;

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

      event.gc.drawImage(image, x, y);
    }
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初与友歌 2024-08-22 16:17:03

重写erase()并且调用super.erase()会有所帮助。

Overriding erase() and not calling super.erase() helped.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文