Нужно сделать таблицу, в которой в некоторых ячейках будет выделяться часть текста. Решил использовать StyledCellLabelProvider и переопределять метод update. В WinXP все работает, а в Linux почему-то во всех ячейках для строки таблицы один и тот же текст выводится.
Вот небольшой пример кода, воспроизводящий проблему:
import org.eclipse.jface.viewers.*;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
public class TestTableViewer {
private static class MyLabelProvider extends StyledCellLabelProvider {
@Override
public void update(ViewerCell cell) {
String element = (String) cell.getElement();
switch (cell.getColumnIndex()) {
case 0:
cell.setText(element);
break;
case 1:
cell.setText(Integer.toString(element.length()));
break;
}
}
}
private static class MyContentProvider implements IStructuredContentProvider {
@Override
public Object[] getElements(Object input) {
return (String[]) input;
}
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
}
private static void createViewer(Shell shell) {
Table table = new Table(shell, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
TableViewer viewer = new TableViewer(table);
table.setLinesVisible(true);
table.setHeaderVisible(true);
TableViewerColumn column;
column = new TableViewerColumn(viewer, SWT.NONE);
column.getColumn().setText("String");
column.getColumn().setWidth(200);
column.getColumn().setResizable(true);
column = new TableViewerColumn(viewer, SWT.NONE);
column.getColumn().setText("Length");
column.getColumn().setWidth(200);
column.getColumn().setResizable(true);
viewer.setContentProvider(new MyContentProvider());
viewer.setLabelProvider(new MyLabelProvider());
viewer.setInput(new String[] { "some string", "some other string", "one more string" });
}
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
createViewer(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Во втором столбце должно быть число (длина строки из ячейки в первом столбце). В WinXP так и выводится, а вот в Linux почему-то не получается. Только в момент изменения размеров окна в Linux текст отображается правильно.
В чем может быть проблема?
P.S. SWT и JFace из Eclipse SDK 3.5