【问题标题】:InputVerifiers not activating when programatically setting text以编程方式设置文本时 InputVerifier 未激活
【发布时间】:2013-04-24 08:19:58
【问题描述】:

我有一个带有 JTextFields 的 swing 应用程序,我将 InputVerifiers 附加到该应用程序。我通过 setText 方法将有效的默认值应用于字段,例如

this.myField.setText("11");

但似乎public boolean verify(JComponent component) 不会被调用,除非将焦点应用于字段。我试图以编程方式请求焦点,但这似乎仍然没有触发 InputVerifier,例如

this.myField.requestFocus();

如何以编程方式设置文本字段文本并让 InputVerifier 触发并运行其 verify() 方法?

我可以在构造 InputVerifier 之后手动触发它,调用 verify() 并传入组件,但这似乎真的没有必要,因为 TextField 已经连接到 InputVerifier。

【问题讨论】:

  • InputVerifier 默认触发那些事件,如果有实现 Swing Action(ev ActionListener),通过包含 shouldYieldFocus() 和验证,可以应用于 JTextComponents 和 JSpinner 和 JComboBox 的派生编辑器,以便更快地获得更好的帮助发布SSCCE,简短、可运行、可编译
  • 我想你是说附加一个会触发并调用输入验证器方法的动作?但是什么时候会触发此操作?

标签: java swing validation jtextfield inputverifier


【解决方案1】:

我通过 setText 方法为字段应用了有效的默认值

如果默认值有效,为什么需要调用输入验证器?

我尝试以编程方式请求焦点

正确的使用方法是:

component.requestFocusInWindow()

但是,这仅在请求关注可见 GUI 上的组件时才有效。

在哪里可以检查所有字段的有效性状态

这个逻辑应该是“提交”按钮的一部分。 InputVerifier 应该只检查字段的数据有效性。 “提交”逻辑检查以确保所有字段的数据都已输入。

【讨论】:

  • 那么,有效性的逻辑在 InputVerifier 中,但是提交按钮的行为如何检查所有字段的有效性,除了显式调用 verify(component) 吗?
  • 提交按钮不需要验证每个组件,InputVerifier 已经这样做了。提交按钮所需要做的就是确保所有文本字段都包含数据(即文本字段不为空)。
  • 如果您的 InputVerifier 没有保持焦点,您可能有需要检查的无效字段。这就是我的问题所在。
  • 不,您不能仅仅因为组件失去焦点而拥有无效字段。当文本字段失去焦点时调用输入验证器。因此,您当时验证了文本字段。数据可以更改的唯一方法是文本字段再次获得焦点。所以当它失去焦点时,它会再次被验证。
  • 就我而言,shouldYieldFocus() 总是返回 true。该字段已验证,但放弃了焦点。我不希望强迫用户“陷入困境”的行为。是的,如果默认值有效,则不必调用它,但我现在,它有一个标志,用于确定在最后一次 verify() 调用之后该字段是否为“有效”,而该字段未被调用。
【解决方案2】:

您可以在myField 上设置DocumentFilter。您的verify() 应该没有任何副作用,因此您可以在过滤器中使用它。当您致电 setText()Document 更改时,将应用过滤器。

【讨论】:

  • 我的输入验证器确实有副作用。也许我做错了。他们设置了一个“有效”标志,以后可以查询该标志以确定表单上的所有字段是否都有效。他们还根据字段是否通过验证来装饰字段。
  • API 说,“这种方法应该没有副作用。”
  • 抱歉,这超出了我最初的问题,但尚不清楚您将如何让 InputVerifiers 控制在表单上执行“提交”功能的能力。您可以独立检查每个字段,但是如果该字段放弃了焦点,那么有什么东西可以让您检查所有字段的有效性状态以确定您是否可以提交表单?这就是我创建自己的类来管理它的原因,我只需要根据请求手动触发验证器。也许 DocumentFilter 就是答案。
  • 如果您不希望用户“卡在该字段中”,只有在您的字段都有效时才可以启用Submit 按钮。您可以在每个字段的shouldYieldFocus()actionPerformed() 中进行检查。状态框也很有帮助。
猜你喜欢
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多