我目前正在使用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();
}
}
答案 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
强制重绘单元格。