绘画细胞背景的表

时间:2017-06-13 12:12:56

标签: java eclipse-plugin swt

我必须对我的Table实施选择,为此必须用蓝色绘制一个单元格的背景(以后可能是前景白色,但这是将来的问题)。

天真的方法就是使用像这样的绘画事件:

table.addListener(SWT.PaintItem, event -> {
        final boolean selection = // calulate somehow;

        if (selection) {
            event.gc.setForeground(this.table.getDisplay().getSystemColor(SWT.COLOR_LIST_SELECTION));
            Rectangle bounds = table.getItem(new Point(event.x, event.y)).getBounds();
            event.gc.fillRectangle(event.x, event.y, bounds.width, bounds.height);
        }
    });

然而,它描绘了单元格中的所有内容,我需要自己绘制表格的全部内容。那不是我现在想做的事。

然后我尝试使用TableItem#setBackground(Color),它会被预先制作的选择和悬停颜色覆盖,即使它们被禁用了:

 table.addListener(SWT.EraseItem, event -> {
        event.detail &= ~SWT.SELECTED;
        event.detail &= ~SWT.HOT;
        event.detail &= ~SWT.FOCUSED;
    });

因此操作系统会以白色显示选中或悬停的行。

我也试过了EraseItemMeasureItem,希望找到一个在绘制单元格之前抛出的事件,这样我才能绘制背景。但是EraseItem描绘了所有内容,MeasureItem中的绘画没有做任何事情。

有没有办法绘制单元格的背景而不必手动绘制前景或被表格的内置选择覆盖?

1 个答案:

答案 0 :(得分:0)

正如greg-449所说,StyledCellLabelProvider可能是要走的路:

tableViewerColumn.setLabelProvider(new StyledCellLabelProvider() {

    @Override
    public void update(ViewerCell cell) {
        cell.setText("Content");

        final int column = cell.getColumnIndex();
        final int row = Arrays.asList(tableViewer.getTable().getItems()).indexOf(cell.getItem());

        if (selection) {
            Display display = cell.getControl().getDisplay();
            cell.setBackground(display .getSystemColor(SWT.COLOR_LIST_SELECTION));
            cell.setForeground(display .getSystemColor(SWT.COLOR_LIST_SELECTION_TEXT));
        }

        super.update(cell);
    }
});

这会被系统的选择覆盖并悬停,直到您添加:

table.addListener(SWT.EraseItem, event -> event.detail &= ~SWT.HOT);
table.addListener(SWT.Selection, e -> table.setSelection(-1));