【问题标题】:SWT TableViewer cell does not display image unless clicked on after updateSWT TableViewer 单元格不显示图像,除非在更新后单击
【发布时间】:2016-08-10 15:16:25
【问题描述】:

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

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

我的问题是为什么不点击就显示不出来?

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();
    }
}

【问题讨论】:

    标签: java swt jface tableviewer


    【解决方案1】:

    您需要在update 中的代码之后调用super.update(cell);

    来自 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 强制重绘单元格。

    【讨论】:

    • 刚刚尝试过,仍然遇到同样的问题。
    • 在调用update 之后,您是否遇到断点cell.setImage(...)?您的 MyStyledCellLabelProvider 还实现了任何接口,例如 ILabelProvider
    • MyStyledCellLabelProvider extends org.eclipse.jface.viewers.StyledCellLabelProviderupdate 在设置图像后被调用。
    • update 在设置图像后被调用?这似乎可以解释这种行为。在update 期间,它应该设置图像,而不是在update 已经完成之后。
    • 很抱歉让您感到困惑。在update 期间正在设置图像。 super.update' is the last thing my overriden implementation of udpate` 正在调用
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2021-11-28
    • 2018-09-08
    • 2015-06-21
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多