表字段中未显示验证图标

2024-01-01

当我进入表格的编辑模式时,我希望在用户超出任何验证约束范围时立即显示数据验证感叹号图标 (!)。

首先,有几点注意事项:

  • 我使用的是 Vaadin 7,所以 Bean Validation 插件很遗憾无法工作。
  • 数据验证按预期进行。

现在,我有一个完美的工作表,我使用 BeanItemContainer 将我的 Person beans 保存在其中。

表和 TableFieldFactory 的代码如下所示:

table.setContainerDataSource(buildContainer());
table.setTableFieldFactory(new TableFieldFactory() {
    @Override
    public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) {
        TextField field = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId,
                uiContext);
        field.setImmediate(true);
        if (propertyId.equals("firstName")) {
            field.addValidator(new BeanValidator(Person.class, "firstName"));
        }
        return field;
    }
});

Person bean 如下所示:

public class Person {

    @Size(min = 5, max = 50)
    private String firstName;

    ... setters + getters...
}

问题是,当我在名字字段中输入某些内容然后按 Enter 或模糊/取消聚焦该字段时,不会显示任何错误指示。我必须将鼠标悬停在该字段上才能看到有什么问题。

我的问题是两个折叠...

  1. 如何让该字段出现时显示感叹号图标 无效的? (这适用于普通的文本字段,即not在表中)
  2. 有没有办法从无效字段立即得到响应 (显示图标)(即在您输入 5 个字符以下后立即, 无需按回车键或模糊/取消聚焦该字段 问题)。

如果我能回答这两个问题就太好了! =)

提前致谢!


  1. 标题、必需指示符(红色星号)和 - 最重要的是 - 错误指示符(感叹号)实际上是由包含组件的布局提供的,not组件本身。当可编辑组件显示在表格中时,它们会显示without布局 - 这就是为什么不显示错误指示器的原因。

    如果我试图将这个圆变成正方形,我会考虑创建一个 CustomField 作为可编辑字段的包装器 - 并在该 CustomField 中显示一个错误指示器,当包装/委托字段变得无效时。我没有尝试过这个 - 我根本没有在表中使用可编辑字段 - 但应该很容易做到。

  2. Add a 文本更改监听器 https://vaadin.com/api/com/vaadin/event/FieldEvents.TextChangeListener.html到FieldFactory中的字段,并在监听器中调用field.validate()。但请注意,field.getValue() 值通常不会更改until模糊/失焦,因此验证器将验证旧值 - 除非您在侦听器中执行 field.setValue(event.getText()) 。看这个帖子 https://vaadin.com/forum/#!/thread/367582在 Vaadin 论坛上了解更多详细信息。

这就是我对验证包装器的意思 - 没有尝试使用它。您将看到 initComponent 只是返回 FormLayout 内的字段,这应该为您提供您正在寻找的图标。 (您可能需要将比我更多的方法从 ValidatingWrapper 委托给委托 - 但快速查看表明这可能就足够了。)

然后,您将该字段包装在 tableFieldFactory 中(第二个代码块)

public class ValidatingWrapper<T> extends CustomField<T> {

  private static final long serialVersionUID = 9208404294767862319L;
  protected Field<T> delegate;

  public ValidatingWrapper(final Field<T> delegate) {
    this.delegate = delegate;

    if (delegate instanceof TextField) {
      final TextField textField = (TextField) delegate;
      textField.setTextChangeEventMode(AbstractTextField.TextChangeEventMode.TIMEOUT);
      textField.setTextChangeTimeout(200);

      textField.addTextChangeListener(new FieldEvents.TextChangeListener() {
        @Override
        public void textChange(FieldEvents.TextChangeEvent event) {
          textField.setValue(event.getText());
          textField.validate();
        }
      });
    }
  }

  @Override
  public Class<? extends T> getType() {
    return delegate.getType();
  }

  @Override
  protected Component initContent() {
    return new FormLayout(delegate);
  }


  @Override
  public Property getPropertyDataSource() {
    return delegate.getPropertyDataSource();
  }

  @Override
  public void setPropertyDataSource(Property newDataSource) {
    delegate.setPropertyDataSource(newDataSource);
  }

}
   

table.setContainerDataSource(buildContainer());
table.setTableFieldFactory(new TableFieldFactory() {
  @Override
  public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) {
    TextField field = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId,
        uiContext);
    field.setImmediate(true);
    if (propertyId.equals("firstName")) {
      field.addValidator(new BeanValidator(Person.class, "firstName"));
    }
    return ValidatingWrapper(field);
  }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

表字段中未显示验证图标 的相关文章

随机推荐

  • 如何从 Android AsyncTask 完成 Activity

    在我的申请中 我有 3 项活动 1 Login 2 AsyncTask 不同班级 3 Welcome 收到所有信息后Login Activity它移动到AsyncTask Activity 当AsyncTask完成后它会移动到Welcome
  • 用于列出 war 文件中文件内容的一个衬垫

    我需要能够读取 jar 文件中的文件内容 例如 MANIFEST 目前我通过提取文件的内容然后列出它来做到这一点 JAVA HOME bin jar xvf SOME WAR FILE war META INF MANIFEST MF ca
  • 如何从我的主流程代码中获取 Electron 标准输出内容?

    我可以以某种方式从我的主进程代码中从 Electron 获取标准输出的内容吗 例如 我有一个电子应用程序 在我的主流程代码中 import app BrowserWindow globalShortcut session from elec
  • 带有 FB 连接的空白弹出窗口

    我已经使用 Javascript SDK 实现了 facebook connect 当我尝试验证的用户未登录 Facebook 时 验证工作正常 但当他已经登录 Facebook 时 登录弹出窗口永远不会关闭 弹出窗口的 URL 以 htt
  • 组合具有多个参数的函数

    如何编写一个 apply 接受多个参数的函数 这是一个人为的例子 val sum List Int gt Int l gt l sum val double Int gt Int i gt i i double compose sum ap
  • 在 boost 上从位集到位集的无序(哈希)映射

    我想使用缓存 由boost实现unordered map 从一个dynamic bitset to a dynamic bitset 当然 问题在于位集中没有默认的哈希函数 这似乎不是一个概念问题 但我不知道如何解决技术细节 我该怎么做呢
  • 以编程方式获取 Android 手机规格

    我正在尝试根据与性能相关的内容对运行我的应用程序的 Android 手机进行分类 我想剔除所有低质量设备 以查看高质量手机的性能 崩溃率 我有设备型号 例如 在 Samsung Galaxy S6 上 Build MODEL 的值可能是 S
  • React 代码锁定在无限循环中 - 不涉及 while 循环

    我对 React 有点陌生 在下面写了这段代码 下面的组件用于渲染故事的时间和日期选择器 时间和日期选择器仅针对计划出现该故事的社交媒体进行渲染 class TaleScheduler extends Component construct
  • JavaScript 中“define”的用途是什么(除了显而易见的)?

    我到处搜索这方面的文档 但我在任何地方都找不到任何东西 我正在使用 Aloha 并希望使用他们的侧边栏原型来创建我自己的新侧边栏 附加到其他插件功能 他们的 sidebar js 就是从这个开始的 但我一生都找不到任何文档来解释它的含义 d
  • 使用 javaConfig 找不到类[重复]

    这个问题在这里已经有答案了 我使用注释动态创建 Bean 出现以下错误 package demoproject import org springframework context annotation Bean import org sp
  • 将我的程序添加到右键菜单

    右键菜单 我的意思是 我真的不知道它叫什么 但我希望它是右键菜单 当我用谷歌搜索这个问题的标题之类的查询时 我什么也没得到 一些教程展示了如何将 exe 添加到该列表等 但我正在寻找一些教程来教我如何处理该数据 右键单击菜单将返回什么 等等
  • Room 持久库将版本重置为 1

    有什么方法可以将房间库版本重置为1 我尝试卸载手机上的应用程序 它不起作用 仅当您完全删除该应用程序时 使用 Room 降级版本才有效 您可以通过 adb adb uninstall your app package 执行此操作 这也会删除
  • 将 Unicode 从 R 写入 SQL Server

    我正在尝试将 Unicode 字符串从 R 写入 SQL 然后使用该 SQL 表来支持 Power BI 仪表板 不幸的是 Unicode 字符似乎仅在我将表加载回 R 时才起作用 而当我在 SSMS 或 Power BI 中查看表时则不起
  • 查找并删除目录及其子目录中的空文件而无需查找

    我正在尝试制作一个 bash 脚本 在不使用 find 命令的情况下查找并删除目录 包括子目录 中的空文件 这是使用 find 命令的脚本的一部分 但我不确定如何在不使用 find 的情况下转换此行 find type f empty de
  • 如何在 SQL 查询中 JOIN 父级的类别表?

    我有一个帖子表 id category id 然后JOIN其类别表为 category id category name parent ONcategory id Parent是另一个类别的category id 例如 category i
  • 如何获取 rq 队列中的作业数量?

    我用过rq http python rq org 和 RedisToGo 如何获取队列中的作业数量 我在文档中找不到它 Python 当我尝试时 print Before len q jobs result q enqueue worker
  • 如何备份SVN仓库? [复制]

    这个问题在这里已经有答案了 我经常听说拥有 SVN 存储库并不能消除备份的需要 这样的备份是如何完成的呢 我的意思是存储库会随着时间的推移而膨胀 不是吗 那么我是否每次都将其作为一个整体进行备份 或者我该怎么做 进行此类备份的最简单方法是什
  • 德墨忒尔定律 - 数据对象

    我试图遵循德米特法则 参见http en wikipedia org wiki Law of Demeter http en wikipedia org wiki Law of Demeter http misko hevery com c
  • Google Maps Javascript API 不响应 iOS 10 中的触摸事件

    我运行一个内置了许多自定义 Google 地图的网站 在搜索或生成往返某个位置的路线后在地图上显示各个位置 我为此使用 Google Maps Javascript API 我的用户开始报告说 在 iOS 10 上 这些地图不再响应触摸事件
  • 表字段中未显示验证图标

    当我进入表格的编辑模式时 我希望在用户超出任何验证约束范围时立即显示数据验证感叹号图标 首先 有几点注意事项 我使用的是 Vaadin 7 所以 Bean Validation 插件很遗憾无法工作 数据验证按预期进行 现在 我有一个完美的工