2016-08-10 23 views
0

我目前正在使用SWT TableViewer。我有一個StyledCellLabelProvider實施。我給了它一組輸入,它顯示它很好。在用例中,用戶可以從表中選擇行來執行某些操作,然後需要將圖標添加到每個修改完成的行上的特定單元格。SWT TableViewer單元格不顯示圖像,除非在點擊後更新

我在這裏遇到的問題是,圖像沒有顯示出來,除非我在執行修改後在物理內部查看tableviewer。請注意,在修改完成後,tableviewer的選擇保持不變。我知道StyledCellLabelProvider中的更新在我調用tableviewer刷新後被調用。

我的問題是爲什麼它不顯示沒有點擊?

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

您需要您的代碼後打電話到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迫使細胞的重繪。

+0

剛剛嘗試過,仍然看到相同的問題。 – roblangenfeld

+0

在更新被調用後,您是否在命中斷點'cell.setImage(...)'?你的'MyStyledCellLabelProvider'也實現了像ILabelProvider這樣的接口嗎? – SomeDude

+0

'MyStyledCellLabelProvider'擴展'org.eclipse.jface.viewers.StyledCellLabelProvider','update'在圖像被設置後被調用。 – roblangenfeld

相關問題