2016-08-10 18 views
0

現在、SWT TableViewerを使用しています。そして私は与えられたStyledCellLabelProviderの実装を持っています。私はそれに一連の入力を与えて、それをうまく表示します。あるユースケースでは、テーブルから特定のアクションを実行するためにテーブルから行を選択することができ、変更が行われた各行の特定のセルにアイコンを追加する必要があります。更新後にクリックしない限り、SWT TableViewerセルに画像が表示されない

私がここに取り組んでいる問題は、変更を行った後にテーブルビューア内で物理的にクリックしない限り、イメージが表示されないということです。テーブルビューアの選択は、変更が実行された後も変わりません。私は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 
} 

おかげで再び!

EDIT:

だから私は忘れてしまった情報の一つが更新されているセルは時々テキストの代わりにそれのorg.eclipse.ui.forms.widgets.Hyperlink既存の内部を持つことになり、画像が追加された後、それを持ち続けるということです。私はこれが問題を引き起こしていると思います。ハイパーリンクコードを削除してテキストに戻ったとき、意図したとおりに機能しました。ここでは、HyperLinkをセルに追加するために使用しているコードを示します。あなたがStyledCellLabelProvider.javaのソースコードからupdate

の内側にあなたのコードの後に​​super.update(cell);を呼び出す必要が

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

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

'update'が呼ばれた後、ブレークポイント' cell.setImage(...) 'を打つのですか?また、あなたの 'MyStyledCellLabelProvider'は' ILabelProvider'のようなインターフェースを実装していますか? – SomeDude

+0

'MyStyledCellLabelProvider'は' org.eclipse.jface.viewers.StyledCellLabelProvider'を拡張し、イメージが設定された後に 'update'が呼び出されています。 – roblangenfeld

関連する問題