如何显示由ICellEditorValidator检测到的验证错误?

8

我有一个TableViewer,其中包含一个ICellModifier,看起来运行良好。 我在其中一个单元格编辑器上设置了一个ICellEditorValidator,但我无法使其按照我想要的方式工作。 这是我的简化代码:

cellEditors[1] = new TextCellEditor(table);
cellEditors[1].setValidator(new ICellEditorValidator() {
    public String isValid(Object value) {
        try {
            Integer.parseInt((String) value);
            return null;
        } catch(NumberFormatException e) {
            return "Not a valid integer";
        }
    }
});

大部分情况下都可以正常工作。不过,有两个问题:

  1. 如果验证程序返回错误,则单元格修改器的modify方法会接收到一个空值作为新值。我可以编写代码处理这个问题,但这似乎不是正确的方式。如果用户选择透明背景颜色,那么空值可能是有效值。(这是一个普遍性的问题,不是特定于此示例的问题。)
  2. 验证程序的错误消息没有显示给用户。这是一个大问题。我也可以添加一个ICellEditorListener并从applyEditorValue方法中显示对话框,如果最后一个值是无效的。这是正确的做法吗?

顺便说一句,由于某些原因,我被限制在Eclipse 3.0框架内。

2个回答

9
您可以向您的编辑器添加监听器:
cellEditors[1].addListener(
        public void applyEditorValue() {                    
            page.setErrorMessage(null); 
        }

        public void cancelEditor() {
            page.setErrorMessage(null);                 
        }

        public void editorValueChanged(boolean oldValidState,
                boolean newValidState) {                    
            page.setErrorMessage(editor.getErrorMessage());                                 
        }

如果page是你当前的FormPage,那么这将向用户显示错误消息。


5
关于第二个问题,验证器的方法 isValid 返回的字符串将成为拥有该验证器的 CellEditor 的错误消息。 您可以使用 CellEditor.getErrorMessage 检索该消息。
我认为最简单的方法是通过ICellEditorListener显示错误消息,就像Sven在上面建议的那样。 也许这个侦听器的棘手之处在于,单元格编辑器没有作为任何方法的参数传递,因此假设侦听器知道哪个单元格编辑器正在与其交谈。
如果您希望对话框、首选项页面或其他对象实现 ICellEditorListener 接口,您必须确保它知道被编辑的单元格编辑器。
但是,如果单元格编辑器本身实现了接口,它应该有一种方法将错误消息正确传递到对话框、首选项页面或其他地方 。这就是Scott要查找的currentForm page
如果您正在使用EditingSupport ,则当ICellEditorValidator.isValue 返回错误消息时,传递到EditingSupport.setValue 方法中的值为null。不要忘记检查它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接