如果某些单元格包含图标,则JFace TableViewer在第一列中的文本位置无效

时间:2015-05-14 17:54:38

标签: java swt jface tableviewer

我注意到,如果其他列中的其他单元格包含图标,则JFace TableViewer在第一列(仅)中显示文本时会遇到一些麻烦。文本出现前的额外空格。我认为还没有发现这个问题,所以可能需要一些额外的配置。这是一个示例:

What is this blank space for?

要测试的简单代码:

public class IconTest {
private static class MyContentProvider implements IStructuredContentProvider {
    public Object[] getElements(Object inputElement) {
        return new String[] { "one", "two", "three", "four", "five", "six", "seven", "eight",
                "nine", "ten" };
    }

    public void dispose() {

    }

    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {

    }
}

/**
 * @param args
 */
public static void main(String[] args) {
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    TableViewer v = new TableViewer(shell, SWT.FULL_SELECTION);
    v.getTable().setLinesVisible(true);
    v.getTable().setHeaderVisible(true);
    v.setContentProvider(new MyContentProvider());

    CellLabelProvider labelProvider = new CellLabelProvider() {

        public void update(ViewerCell cell) {
            cell.setText(cell.getElement().toString());
        }
    };

    CellLabelProvider labelProvider2 = new CellLabelProvider() {
        public void update(ViewerCell cell) {
            cell.setText(cell.getElement().toString());
            cell.setImage(Display.getDefault().getSystemImage(SWT.ICON_QUESTION));
        }
    };

    TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
    column.setLabelProvider(labelProvider);
    column.getColumn().setText("Column 1");
    column.getColumn().setWidth(100);

    TableViewerColumn column2 = new TableViewerColumn(v, SWT.NONE);
    column2.setLabelProvider(labelProvider2);
    column2.getColumn().setText("Column 2");
    column2.getColumn().setWidth(100);

    v.setInput("");

    shell.setSize(400, 400);
    shell.open();

    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }

    display.dispose();
}
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这是一个长期存在的已知问题 - 请参阅Eclipse错误报告43910(从2004年开始!)

错误报告说基础Windows表格代码的行为与此类似,SWT / JFace无法做到这一点。

您可以通过使用OwnerDrawLabelProvider解决此问题,StyledCellLabelProvider可以完全控制细胞的绘制方式。 OwnerDrawLabelProvider是为select mcr_categories.name from mcr_versions left join mcr_plugins on mcr_plugins.id = mcr_versions.plugin_id left join plugin-category-relationships on plugin-category-relationships.plugin_id = mcr_versions.plugin_id left join mcr_categories on mcr_categories.cat_id = plugin-category-relationships.cat_id order by mcr_versions.time desc limit 10; 派生的,更易于使用。