问题描述
我有一个与here相似的用例。我想将SWT表项目选择背景颜色从默认的灰色或蓝色更改为其他颜色。我尝试使用StyledCellLabelProvider#update方法,但没有用。它只是将所有表格项的背景色更新为给定的颜色。但我需要它仅适用于所选项目。下面是我的标签提供程序更新方法的代码段
@Override
public void update(ViewerCell cell) {
cell.setText(provider.getDisplay((T) cell.getElement(),cell.getColumnIndex()));
TableItem currentTableItem = ((TableItem) cell.getViewerRow().getItem());
if (currentTableItem.getParent().getSelectionCount() > 0) {
TableItem selectedTableItem = currentTableItem.getParent().getSelection()[0];
if(currentTableItem == selectedTableItem) {
cell.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION));
}
}
cell.setForeground(provider.getDisplayColor((T) cell.getElement(),cell.getColumnIndex()));
super.update(cell);
}
提前感谢您的帮助!
解决方法
选择颜色通常由操作系统选择,因此要更改颜色,您必须关闭StyledCellLabelProvider
erase
,measure
和paint
中的选定标志方法。您还必须使用erase
方法自己绘制选择颜色。
类似以下内容:
@Override
protected void erase(final Event event,final Object element)
{
if ((event.detail & SWT.SELECTED) != 0) {
event.detail &= ~SWT.SELECTED;
Rectangle bounds = event.getBounds();
event.gc.setBackground(Display.getDefault().getSystemColor(SWT.COLOR_LIST_SELECTION));
event.gc.fillRectangle(bounds);
}
super.erase(event,element);
}
@Override
protected void measure(final Event event,final Object element)
{
event.detail &= ~SWT.SELECTED;
super.measure(event,element);
}
@Override
protected void paint(final Event event,final Object element)
{
event.detail &= ~SWT.SELECTED;
super.paint(event,element);
}