Оформление ячейки с несколькими строками в TableViewer

#java #swt #jface

Вопрос:

У меня есть просмотрщик таблиц, из которого я скопировал код https://wiki.eclipse.org/JFaceSnippets#Snippet006TableMultiLineCells чтобы включить многострочные записи в ячейках. Поэтому я переопределил методы paint() и measure() в своем StyledCellLabelProvider, и paint выглядит так:

 @Override
protected void paint(Event event, Object element) {
    TableData cellData = getCellData((TableEntry) element, event.index);
    String text = parseData(cellData);
    event.gc.drawText(text, event.x, event.y, true);
}
 

Это работает так, как задумано. Теперь я также хочу раскрасить отдельные слова в ячейках, и у меня есть такой метод обновления:

 @Override
public void update(ViewerCell cell) {
    doSomeStuff()
    ...
    cell.setText(myStyledString.getString());
    if (!ranges.isEmpty()) {
        cell.setStyleRanges(ranges.toArray(new StyleRange[ranges.size()]));
    } else {
        cell.setStyleRanges(new StyleRange[] {});
    }
    cell.setBackground(myColor);
    super.update(cell);
}
 

Однако стиль текста не работает. Я бы предположил, что существует некоторый конфликт между DrawText и setText в методах рисования и обновления соответственно. Между тем, фон имеет миКолор, как и предполагалось, когда я использую их оба.

Есть ли способ задать цвет слова в методе рисования или как-то иначе обойти это? Поскольку многострочный «взлом» — это обходной путь, я не могу найти в этом большой помощи при поиске в Интернете.

Комментарии:

1. GC.drawText просто использует текущие цвета, установленные в GC. Чтобы использовать диапазоны стилей, вам нужно будет обработать все диапазоны стилей, установив цвета в GC для каждого диапазона. В принципе, вам придется взглянуть на StyledCellLabelProvider paint метод и сделать большую часть того, что он делает, измененным для нескольких строк.