8

我有一个带有 ICellModifier 的 TableViewer,它似乎工作正常。不过,我在其中一个单元格编辑器上设置了 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如果验证器返回错误,则单元格修饰符的方法接收 null 作为新值。我可以编写代码来处理这个问题,但这似乎不对。Null 可能是一个有效值,例如,如果用户选择背景颜色并且他们选择透明。(这是一个普遍问题,并非针对此示例。)
  2. 验证器的错误消息永远不会显示给用户。这是个大问题。applyEditorValue如果最后一个值无效,我还可以添加一个 ICellEditorListener 并从该方法显示一个对话框 。这是“正确”的做法吗?

顺便说一句,由于我无法控制的原因,我仅限于 Eclipse 3.0 框架。

4

2 回答 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 ,这将向用户显示 errorMessage

于 2009-12-09T09:39:44.617 回答
5

关于第二个问题,验证器方法返回的字符串成为拥有该验证器isValid的错误消息。CellEditor您可以使用 检索该消息CellEditor.getErrorMessage

在我看来,显示错误消息的最简单方法是通过 a ICellEditorListener,正如 Sven 上面所建议的那样。也许这个监听器的棘手之处在于单元格编辑器没有作为参数传递给它的任何方法,因此假设监听器知道哪个单元格编辑器正在与它交谈。

如果您想要对话框、首选项页面或任何对象来实现ICellEditorListener接口,您必须确保它知道正在编辑的单元格编辑器。

但是,如果是单元格编辑器本身实现了接口,它应该有办法将错误消息正确地传递到对话框、首选项页面或其他任何内容中。这就是currentForm page斯科特正在寻找的。

如果您正在使用,最后需要注意的一件事是,当返回错误消息时EditingSupport,传递给该EditingSupport.setValue方法的值是 null 。ICellEditorValidator.isValue别忘了检查一下。

于 2011-07-13T08:24:05.330 回答