Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StyledCellLabelProvider不会对前景擦除做出反应_Java_Eclipse Plugin_Jface - Fatal编程技术网

Java StyledCellLabelProvider不会对前景擦除做出反应

Java StyledCellLabelProvider不会对前景擦除做出反应,java,eclipse-plugin,jface,Java,Eclipse Plugin,Jface,考虑以下表格查看器的工作示例: final Display display = new Display(); final Shell shell = new Shell(display); shell.setLayout(new FillLayout()); final ColumnLabelProvider labelProvider = new ColumnLabelProvider(); final TableViewer viewer = ne

考虑以下
表格查看器的工作示例:

    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    final ColumnLabelProvider labelProvider = new ColumnLabelProvider();

    final TableViewer viewer = new TableViewer(shell,
            SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
    viewer.setContentProvider(ArrayContentProvider.getInstance());

    final TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.NONE);
    viewerColumn.setLabelProvider(labelProvider);
    viewerColumn.getColumn().setText("");
    viewerColumn.getColumn().setWidth(100);

    viewer.setInput(Arrays.asList("1", "2", "3"));

    shell.pack();
    shell.open();

    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
这是一个包含元素“1”、“2”和“3”的简单表格。现在我想自己绘制表项,因此我添加了以下行:

    viewer.getTable().addListener(SWT.EraseItem, e -> e.detail &= ~SWT.FOREGROUND);
…和一个绘画监听器,但要理解我的问题,只要看到现在没有显示项目就足够了(这是正确的)

因此,现在我想添加一个
StyledCellLabelProvider
,在不修改现有代码的情况下为单元格设置样式:

    final StyledCellLabelProvider styledLabelProvider = new StyledCellLabelProvider() {

        @Override
        public void update(ViewerCell cell) {
            labelProvider.update(cell);
            cell.setBackground(cell.getControl().getDisplay().getSystemColor(SWT.COLOR_RED));
            super.update(cell);
        }
    };
    // [snip][snap]

    viewerColumn.setLabelProvider(styledLabelProvider);
有趣的是,尽管我试图在
SWT.EraseItem
监听器中删除这些项,但现在这些项又显示出来了


有人能告诉我为什么吗?理想情况下如何修复它?

如果您使用StyledCellLabelProvider,您应该覆盖其
擦除
测量
绘制
方法,因为它们已经在使用橡皮擦项、测量项和绘制项侦听器。@greg-449它不适用于
擦除(事件、对象)中的
e.detail&=~SWT.FOREGROUND
也是。我真的不明白你想在这里做什么
StyledCellLabelProvider
希望您在
update
方法中使用单元格
setBackground
setForeground
setText
以及可能的
setStyleRange
调用。我不认为它是如何与其他擦除、测量和绘制侦听器交互的。@greg-449我想它可以归结为:对于
ColumnLabelProvider
,我可以使用
event.detail&=~SWT.FOREGROUND
禁用前面的绘制。我想对
StyledCellLabelProvider
执行同样的操作。(因为当前的API是在假定设置了
TableItem
s文本的情况下工作的,我希望在从一个标签提供程序切换到另一个标签提供程序时尽可能少地进行更改。)@SteffiS。您能告诉我为什么要使用paint listener和SWT.EraseItem来设置单元格的背景色和前景色吗?你对你的项目有什么特别的要求吗?即使使用StyledCellLabelProvider,我们仍然可以设置单元格的背景色和前景色。请回复,以便我可以向您提供示例代码片段