【问题标题】:Moving caret in JTextField using PlainDocument使用 PlainDocument 在 JTextField 中移动插入符号
【发布时间】:2012-09-24 14:02:53
【问题描述】:

我正在编写一个基于 JTextField 的自定义控件。我的 JTextField 使用我自己的 Document 类,从 PlainDocument 派生,这样我就可以处理覆盖 insertString(...)remove(...) 方法中的所有用户输入。

这就是问题所在。处理用户输入后,有时我想将插入符号移动到另一个位置。有什么更好的方法?

默认情况下 Document 将插入符号放在最后一个输入旁边。所以我试图将一个字符放在我的目标位置并立即删除它。由于某种原因,它在remove() 方法中不起作用......而且代码看起来不太好:)

感谢您的建议。

【问题讨论】:

  • 当你说“重载”时,你的意思是你扩展了PlainDocument吗?当你说你重载了方法 insertString() 和 remove() 时,是不是“重载”了?或“覆盖”?重载=相同的方法名称但不同的参数。重写,意味着你扩展了一个类,并且重写了父类中存在的方法(相同名称和相同参数)?
  • 对不起,是的,我的意思是我的类是从 PlainDocument 派生的,这些方法被覆盖了。
  • 我正在编写一个基于 JTextField 的自定义控件 - 为什么?它应该具有哪些核心不支持的功能?请记住:所有 JSomething 都设计为按原样使用,只需根据您的需要进行配置。

标签: java swing jtextfield caret


【解决方案1】:
  • 似乎没有必要扩展 PlainDocument。只需将DocumentListener 添加到 JTextField 的 Document 中,您就可以在 DocumentListener 中声明的 3 种方法中处理用户输入
  • 使用setCaretPosition 将插入符号移动到您想要的任何位置

【讨论】:

  • 我想在文本字段更新之前捕获用户的输入并更改它。具体来说 - 我正在编写一个日期输入控件。如果用户输入了不合适的符号,文档必须忽略它,如果用户从剪贴板粘贴一个字符串,文档必须逐个字符地解析它并决定将什么放入该字段。我可以用 DocumentListener 来做吗?我可能错了,但看起来它只给我有关输入的通知。
  • @IlyaIvanov 重新发明轮子 :-) 看看 JFormattedTextField,它可以配置为完全做到这一点。
  • @kleopatra JFormattedTextField 是一个好点,谢谢!但是我的客户真的想要一个全新的轮子 :) 我不需要在 focusLost 上验证已经输入的内容,而是需要控制每个用户的移动并即时更改输入。
【解决方案2】:

如果您想控制用户输入,您实际上应该使用DocumentFilterDocumentFilter 允许您在发生时拦截所有输入。然后您可以使用JTextField.setCaretPosition(来自JTextComponent)来设置插入符号的位置。只需向您的 DocumentFilter 实现传递对 JTextField 的引用,以便它可以为您设置插入符号位置。

这是Java trail for DocumentFilter。另外,example on JavaRanch

【讨论】:

  • 如果涉及到自定义插入符号定位,要使用的过滤器是 NavigationFilter。结合 Document-/NavigationFilter 的一个示例是 Default/International/Formatter(不要告诉我确切的细节,目前手头没有可用的资源 :-)
猜你喜欢
  • 1970-01-01
  • 2014-01-29
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多