除非在更新

时间:2016-08-10 15:16:25

标签: java swt jface tableviewer

我目前正在使用SWT TableViewer。我给它一个StyledCellLabelProvider实现。我已经给它一组输入,它显示它很好。有一个用例,用户可以从表中选择行来执行某些操作,然后需要将图标添加到完成修改的每一行的特定单元格中。

我遇到的问题是图像没有显示,除非我在执行修改后在tableviewer内部物理点击。请注意,在执行修改后,tableviewer的选择保持不变。我知道在我在tableviewer上调用refresh后调用StyledCellLabelProvider中的更新。

我的问题是为什么没有点击就没出现?

MyStyledCellLabelProvider

public void update(ViewerCell cell) {
    if (cell.getElement() instanceof Foo && ((Foo)cell.getElement()).hasBeenModified()) {
       cell.setImage(myImage);
    }
    cell.setText("ABCD");
}

TableViewerComposite

@Override
public void notifyModificationMade(Object[] modifiedObjects){
    //Update input on tableviewer
    ...
   //Refresh after updating
   tableViewer.refresh(); //Triggers the StyledCellLabelProvider to be called 
}

再次感谢!

编辑:

因此,我忘记的一条信息是,正在更新的单元格有时会在其中存在org.eclipse.ui.forms.widgets.Hyperlink而不是文本,并且在添加图像后将继续使用它。我认为这是造成这个问题的原因。当我删除超链接代码并返回文本时,它按预期工作。以下是我用于将HyperLink添加到单元格的代码。

public void update(ViewerCell cell) {
    if (cell.getElement() instanceof Foo && ((Foo)cell.getElement()).hasBeenModified()) {
       cell.setImage(myImage);
       final Hyperlink link = new Hyperlink((Composite) cell.getViewerRow().getControl(),
                        SWT.UNDERLINE_LINK);
       link.setUnderlined(true);
       link.setBackground(link.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
       link.setForeground(link.getDisplay().getSystemColor(SWT.COLOR_BLUE));
       link.setText("My url");
       link.setHref(url);
       link.addHyperlinkListener(new HyperlinkAdapter() {
                    ...
       });

       TableItem item = (TableItem) cell.getItem();
       TableEditor editor = new TableEditor(item.getParent());
       editor.grabHorizontal = true;
       editor.grabVertical = true;
       editor.setEditor(link, item, cell.getColumnIndex());
       editor.layout();
    }
}

1 个答案:

答案 0 :(得分:0)

您需要在super.update(cell);

中的代码后面调用update

从StyledCellLabelProvider.java的源代码中,update方法说

/*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.viewers.OwnerDrawLabelProvider#update(org.eclipse.jface.viewers.ViewerCell)
     */
    public void update(ViewerCell cell) {
        // clients must override and configure the cell and call super
        super.update(cell); // calls 'repaint' to trigger the paint listener
    }

超类OwnerDrawLabelProvider.java强制重绘单元格。