【问题标题】:Java Swing dependent field validationJava Swing 依赖字段验证
【发布时间】:2011-08-09 19:43:41
【问题描述】:

在焦点转移期间,有没有办法验证相关字段,使得 JComponents (a, b, c) 之间的焦点转移不被否决,但到某个外部元素(例如,d)的焦点转移被否决?

做这种事情最自然的地方似乎在InputVerifier.shouldYieldFocus();但是,我当时看不到获得(下一个)焦点目标的方法。

【问题讨论】:

  • 我怀疑这在某种程度上违反了一些 Java Focus Subsystem 原则,否则会有一种明显(如果不简单)的方法来实现这一点。
  • 为了更快/更好地帮助您编辑帖子,并使用可显示您的问题的可运行示例,sscce.org
  • 谢谢,如果我能找到一种方法将我正在开发的应用程序简化为一个简单的示例,我会在这里发布。

标签: java swing validation


【解决方案1】:

InputVerifier 机制不支持。并且可能不应该在那个粒度级别,因为它可能会导致将注意力集中在 d 中,而 a 中的数据无效。

假设 InputVerifier 知道相反的组件(即潜在的下一个 focusOwner)并且其数据无效

  • 在 shouldYieldFocus 中测试相反的结果
    • 对于 b 它允许传输
  • 将焦点转移到 b
  • 将焦点转移到 d(允许)

(与 Rob 的建议总体效果相同,顺便说一句,除了 a 的 InputVerifier 从未运行)

总体而言,内置验证支持不是很强大 - 开发人员需要做很多工作。你需要做的一些事情

  • 可以在每个组件级别使用 InputVerifiers 来实际进行验证,shouldYield 总是返回 true
  • 有一些“InputVerifierController”检查焦点是否“向外”
  • 如果将任何无效数据带到“外部”,“内部”的任何地方都会阻止传输

使用像 f.i. 这样的框架JGoodies 验证可能更容易。

【讨论】:

  • 谢谢,我遇到困难主要是因为我使用的是自己的自定义 InputVerifier,但我似乎看不到相反的组件。您的第二个建议(使用一些“InputVerifierController”)似乎很有希望;我将研究 Swing 在控制器方面实现了什么,用于调用 InputVerifier 来验证焦点转移。
【解决方案2】:

对于你应该可以使用的依赖组件:

component.setVerifyInputWhenFocusTarget( false );

【讨论】:

  • 不幸的是,我仍然需要验证用户在该字段中输入的内容,因为这可能会触发其他操作。
猜你喜欢
  • 2016-05-27
  • 2011-04-27
  • 1970-01-01
  • 2016-11-08
  • 2011-01-01
  • 2013-09-12
  • 2020-04-17
  • 2012-09-13
  • 2016-01-10
相关资源
最近更新 更多