java - ComboBoxCellEditor 不更改标签

标签 java eclipse swt

我目前正在开发 Eclipse4 RCP 应用程序并尝试获取 JFace TableViewer有两列,其中一列可选择 ComboBoxCellEditor在上面。

一个大问题如下:如果我从组合框中选择一个值,则该列的标签不会改变。如果我再次单击组合框,它会显示应显示的值。

因此,例如,如果我可以选择“Expr”和“String”并且当前选择是“Expr”,如果我从组合中选择“String”并单击其他位置,组合仍然显示“Expr”。如果我再次单击组合框并且它获得焦点,它会显示“字符串”。如果我再次点击其他地方,它仍然显示“Expr”。

我使用几个类来运行表。

我的模型类:

private String element;
private String type;

public TableModelElement(String element, String type) {
    this.element = element;
    this.type = type;
}

public TableModelElement(String element) {
    this(element, SetTypeEnum.SET_TYPE_STRING.toString());
}

public TableModelElement() {
    this("", SetTypeEnum.SET_TYPE_STRING.toString());
}
//And Getter/Setter

我的SetTypeEnum:

public enum SetTypeEnum {
SET_TYPE_EXPR("expr"), SET_TYPE_STRING("string");

private final String setType;

private SetTypeEnum(String setType) {
    this.setType = setType;
}

@Override
public String toString() {
    return setType;
}

public static String[] toArray() {
    String[] values = new String[SetTypeEnum.values().length];
    int i = 0;
    for (SetTypeEnum value : SetTypeEnum.values()) {
        if (i < values.length) {
            values[i] = value.toString();
            i++;
        }
    }
    return values;
}
}

TableViewer 启动器:

public class SetTable {

    private TableViewer viewer;
    private TableLayout layout;
    private TableViewerColumn colElementText;
    private TableViewerColumn colElementType;

    public SetTable(Composite parent) {
        layout = new TableLayout();
        layout.addColumnData(new ColumnWeightData(3));
        layout.addColumnData(new ColumnWeightData(1));
        Table table = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION
                | SWT.V_SCROLL);
        table.setLinesVisible(true);
        table.setHeaderVisible(true);
        table.setLayout(layout);
        viewer = new TableViewer(table);
        viewer.getControl().setLayoutData(
                new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
        colElementText = new TableViewerColumn(viewer, SWT.NONE);
        colElementText.getColumn().setResizable(true);
        colElementText.getColumn().setText("Wert");
        colElementType = new TableViewerColumn(viewer, SWT.NONE);
        colElementType.getColumn().setResizable(false);
        colElementType.getColumn().setText("Typ");
        EditingSupport exampleEditingSupport = new SetTableEditingSupport(
                colElementType.getViewer());
        colElementType.setEditingSupport(exampleEditingSupport);
        viewer.setContentProvider(new ArrayContentProvider());
        viewer.setLabelProvider(new SetTableLabelProvider());

        TableModelElement[] model = new TableModelElement[] {
                new TableModelElement("Test1",
                        SetTypeEnum.SET_TYPE_EXPR.toString()),
                new TableModelElement("Test2",
                        SetTypeEnum.SET_TYPE_EXPR.toString()) };
        viewer.setInput(model);
    }

和编辑支持:

public class SetTableEditingSupport extends EditingSupport {

    private ComboBoxViewerCellEditor cellEditor = null;

    public SetTableEditingSupport(ColumnViewer colViewer) {
        super(colViewer);
        cellEditor = new ComboBoxViewerCellEditor((Composite) getViewer()
                .getControl(), SWT.READ_ONLY);
        cellEditor.setLabelProvider(new LabelProvider());
        cellEditor.setContentProvider(new ArrayContentProvider());
        cellEditor.setInput(SetTypeEnum.toArray());
    }

    @Override
    protected CellEditor getCellEditor(final Object element) {
        return cellEditor;
    }

    @Override
    protected boolean canEdit(Object element) {
        return true;
    }

    @Override
    protected Object getValue(Object element) {
        if (element instanceof TableModelElement) {
            TableModelElement data = (TableModelElement) element;
            return data.getType();
        }
        return null;
    }

    @Override
    protected void setValue(Object element, Object type) {
        if (element instanceof TableModelElement && type instanceof String) {
            TableModelElement data = (TableModelElement) element;
            String newType = (String) type;
            /* only set new value if it differs from old one */
            if (!data.getType().equals(newType)) {
                data.setType(newType);
//              String[] items =((CCombo)cellEditor.getControl()).getItems(); 
//              for(int i=0;i<items.length;i++) {
//                  if(items[i].equalsIgnoreCase(newType)) {
//                      System.out.println("Will select Combo index i=" + i);
//                      ((CCombo)cellEditor.getControl()).select(i);
//                  }
//              }
            }
        }
    }
}

注释部分是我尝试手动设置组合值的地方,但它不起作用。我认为所选值甚至可能不是问题,就像我聚焦组合框一样,会显示正确的值。我还尝试向 ComboBoxCellEditor 添加自定义 LabelProvider,但这也不会改变行为(这并不奇怪,因为标准实现使用 toString 方法)

最佳答案

编辑中支持setValue方法调用:

getViewer().update(element, null);

将其放在通话之后:

data.setType(newType);

这告诉表查看器它需要从内容提供者更新元素。

关于java - ComboBoxCellEditor 不更改标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26672685/

相关文章:

java - Maven 全新安装构建失败 : Spring Boot- MVC, JPA

eclipse - 如何在 Vim 中像 Eclipse 一样格式化 Java 文件

SWT 覆盖布局

java - 其他专栏中的工具提示与 Java SWT?

java - 在菜单中显示多列

java - 我如何管理 WebSphere 中的类路径

Eclipse 卡在搜索对话框中

java - 如何查找数组列表中不同项目的总数。

java - 如何在 Spring 3 中使用 Velocity Tools 获取 VelocityEngine

javac:无效的目标版本:执行 Maven 命令时在 Mac 上为 1.8