2012-09-24 96 views
4

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

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

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

谢谢你的建议。

+3

当你说“重载”时,你的意思是说你已经扩展了PlainDocument?当你说你重载了方法insertString()和remove()时,它是否“超载”?或“重写”?重载=相同的方法名称,但不同的参数。 Overriden,意味着你已经扩展了一个类,并且你已经重写了一个存在于父类中的方法(相同的名称和相同的参数)? –

+0

对不起,是的,我的意思是我的类是从PlainDocument派生的,并且这些方法被重写。 –

+0

_I'm写一个自定义控件,基于JTextField_ - 为什么?该核心不支持哪些功能?请记住:所有JSomething都是按照原样使用的,只需配置即可满足您的需求。 – kleopatra

回答

2
  • 似乎没有必要扩展PlainDocument。只需添加一个DocumentListener您JTextField的文档,你可以处理在的DocumentListener
  • 使用setCaretPosition声明的3种方法,用户输入移动插入点,无论你想
+0

我想捕捉用户的输入并在更新文本字段之前对其进行更改。具体来说 - 我正在写一个日期输入控件。如果用户输入不正确的符号,文档必须忽略它,如果用户从剪贴板粘贴字符串,文档必须通过字符解析char,并决定将进入该字段的内容。 我可以使用DocumentListener吗?我可能是错的,但看起来它只是给我通知输入。 –

+1

@IlyaIvanov重新发明轮子:-)看看JFormattedTextField,它可以被配置为完成这个。 – kleopatra

+0

@kleopatra JFormattedTextField是一个很好的观点,谢谢!但我的客户真的很想要一个全新的weel :)我不需要验证focusLost上已经输入的内容,而是需要控制每个用户移动并随时修改输入。 –

2

你实际上应使用DocumentFilter如果你想控制用户输入。 A DocumentFilter允许您截取所有输入。然后您可以使用JTextField.setCaretPosition(来自JTextComponent)设置插入位置。只需传递您的DocumentFilter实现参考JTextField,以便它可以为您设置插入位置。

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

+1

如果涉及自定义插页定位,则要使用的过滤器是NavigationFilter。将Document-/NavigationFilter结合起来的一个例子是Default/International/Formatter(不要让我知道确切的细节,目前没有这些源代码:-) – kleopatra

相关问题