表格

2017-06-13 23 views
0

的油漆单元格背景我必须实现对我的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; 
    }); 

从而显示被选中或悬停的行由OS在白色。

我试过EraseItemMeasureItem以及希望找到一个在单元被绘制之前抛出的事件,所以我只能绘制背景。但EraseItem涂料在一切和MeasureItem绘画不会做任何事情。

有什么方法可以绘制单元格的背景,而无需手动绘制前景或被表格的内置选择覆盖?

+0

这只是'Table'或者你在使用'TableViewer' - 它支持一个实现'IColorProvider'的标签提供者。 –

+0

@ greg-449它是一个'TableViewer',但表格和列上的标签提供者都会被选择和悬停覆盖。 –

+0

对于TableViewer,我使用扩展的StyledCellLabelProvider来绘制自定义选择指示符(和样式文本)。 –

回答

0

格雷戈-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)); 
+0

我仍然无法理解你的问题。你想设置你选择的单元格的背景和前景色(鼠标或箭头键选择单元格),对吧? –