Java 使用PlainDocument在JTextField中移动插入符号

Java 使用PlainDocument在JTextField中移动插入符号,java,swing,jtextfield,caret,Java,Swing,Jtextfield,Caret,我正在编写一个基于JTextField的自定义控件。我的JTextField使用我自己的文档类,该类派生自PlainDocument,因此我可以在重写的insertString(…)和remove(…)方法中处理所有用户输入 问题出在这里。在处理用户输入后,有时我想将插入符号移动到另一个位置。更好的方法是什么 默认情况下,文档将插入符号放在最后一个输入旁边。所以我试着把一个字符放到我的目标位置,并立即删除它。由于某些原因,它在remove()方法中不起作用。。。代码看起来不太好:) 感谢您的支持

我正在编写一个基于JTextField的自定义控件。我的JTextField使用我自己的文档类,该类派生自PlainDocument,因此我可以在重写的
insertString(…)
remove(…)
方法中处理所有用户输入

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

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

感谢您的支持和建议。

  • 似乎没有必要扩展明文。只需向JTextField的文档中添加一个,就可以在DocumentListener中声明的3个方法中处理用户输入
  • 用于将插入符号移动到您想要的任何位置

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


这是我的建议。还有,.

当你说“重载”时,你的意思是你已经扩展了明文吗?当您说您重载了insertString()和remove()方法时,是“重载”吗?还是“凌驾”?重载=相同的方法名,但参数不同。重写,表示您扩展了一个类,并且重写了父类中存在的一个方法(相同的名称和参数)?对不起,是的,我的意思是我的类派生自PlainDocument,并且这些方法被重写。我正在编写一个基于JTextField的自定义控件-为什么?核心不支持哪些功能?请记住:所有JSomething都是按原样设计的,只需配置以满足您的需要。我希望捕获用户的输入并在更新文本字段之前对其进行更改。具体来说,我正在编写一个日期输入控件。若用户输入了不合适的符号,文档必须忽略它,若用户从剪贴板粘贴了一个字符串,文档必须逐个字符地解析它,并决定什么将进入该字段。我可以用DocumentListener做吗?我可能错了,但看起来它只是给了我关于输入的通知。@IlyaIvanov重新发明了轮子:-)看看JFormattedTextField,它可以被配置为完全这样做。@kleopatra JFormattedTextField是一个很好的观点,谢谢!但是我的客户真的想要一个全新的weel:)我不需要验证focusLost上已经存在的输入,相反,我需要控制每个用户的移动并动态更改输入。如果涉及自定义插入符号定位,则要使用的过滤器是NavigationFilter。结合使用Document-/NavigationFilter的一个例子是Default/International/Formatter(不要告诉我确切的细节,目前手头上没有源代码:-)