Я использую компонент SWT JFace TableViewer
для отображения списка данных.Я реализовал IColorProvider
для предоставления собственного цвета переднего плана и фона.В большинстве случаев я выделяю черный текст переднего плана светлым цветом.Однако в некоторых случаях я использую темный цвет фона с белым текстом на переднем плане.Это вызывает проблему в Windows 7 в том, что цвет выделения - бледно-синий.
То, что происходит в Windows 7, это когда при выборе темного элемента в моей таблице (выделение строки) цвет фона является бледно-синим цветом выделения.Тем не менее, цвет переднего плана остается белым, и его нельзя увидеть (см. Рис. 1 ниже).
Рисунок 1: JFace SWT TableViewer - строка, выбранная в Windows 7
Во-первых, я здесь что-то не так делаю?
Во-вторых, я попытался исправить это (какие-либо идеи по поводу рисования события HOT?):
table.addListener(SWT.EraseItem, new Listener() {
public void handleEvent(Event event) {
System.out.println(event);
boolean selected = (event.detail & SWT.SELECTED) == 0;
event.detail &= ~SWT.HOT;
TableItem item = (TableItem) event.item;
int clientWidth = table.getClientArea().width;
GC gc = event.gc;
Color oldForeground = gc.getForeground();
Color oldBackground = gc.getBackground();
if (selected) {
gc.setForeground(ColourHelper.WHITE);
gc.setBackground(ColourHelper.WHITE);
gc.fillRectangle(0, event.y, clientWidth, event.height);
} else {
gc.setForeground(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_BACKGROUND_GRADIENT));
gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_TITLE_BACKGROUND));
gc.fillGradientRectangle(0, event.y, clientWidth, event.height, true);
}
gc.setForeground(oldForeground);
gc.setBackground(oldBackground);
event.detail &= ~SWT.SELECTED;
}
});
При повторном запуске моего тестового приложения я получаю следующее.Выбранная строка исправлена, но все еще существует проблема со строкой таблицы, которая «зависла», как показано на рисунке 2. Я попытался захватить событие SWT.HOT в обработчике EraseItem, но это не похожесделать что-нибудь.
Рисунок 2: JFace SWT TableViewer - добавлен обработчик событий EraseItem
Мне немного повезло, добавив обработчик событий PaintItem (как показано ниже), ноМне нужно будет поместить ту же логику относительно выравнивания ячеек в этот код, чтобы он правильно отображалсяКроме того, мое событие рисования запускает и закрашивает корректно отображаемое исправление ВЫБОР цвета Windows 7.
table.addListener(SWT.PaintItem, new Listener() {
public void handleEvent(Event event) {
boolean hot = (event.detail & SWT.HOT) == 0;
if (hot) System.out.println("HOT!");
if ((event.detail & SWT.HOT & ~SWT.SELECTED) == 0)
return;
event.detail &= ~SWT.HOT;
final int TEXT_MARGIN = 3;
GC gc = event.gc;
gc.setForeground(ColourHelper.BLACK);
gc.setBackground(ColourHelper.BLACK);
TableItem item = (TableItem) event.item;
item.setBackground(ColourHelper.BLACK);
item.setForeground(ColourHelper.BLACK);
String text = item.getText(event.index);
int yOffset = 0;
if (event.index == 1) {
Point size = event.gc.textExtent(text);
yOffset = Math.max(0, (event.height - size.y) / 2);
}
event.gc.drawText(text, event.x + TEXT_MARGIN, event.y + yOffset, true);
}
});
В заключение, возможно, я что-то не так делаю с IColourProvider
, и это так просто?Кроме того, есть ошибка в компоненте Table
или TableViewer
.Я обновился до последней версии, загрузив RCP 3.6.1, но у меня те же симптомы.
Некоторая помощь будет высоко ценится: -)