Java JTextField:当textfield已满/autoskip/Auto Tabbing时,聚焦下一个组件

Java JTextField:当textfield已满/autoskip/Auto Tabbing时,聚焦下一个组件,java,swing,jtextfield,Java,Swing,Jtextfield,我想用JTextField实现autoskip,但不知道最好的方法是什么 什么是自动分页/自动分页?当您达到文本字段的定义长度限制时,将自动转到下一个字段。(如按Tab键,聚焦下一个组件)或此行为使用什么名称 我试过这个: JTextField.getDocument.addChangeListener():比较长度和插入符号位置。 似乎可用,但我无法区分键入的用户输入和对JTextField.setText(String)的调用 当通过gui刷新更改文本时,不应更改焦点 您认为实现这一点的最佳

我想用JTextField实现autoskip,但不知道最好的方法是什么

什么是自动分页/自动分页?当您达到文本字段的定义长度限制时,将自动转到下一个字段。(如按Tab键,聚焦下一个组件)或此行为使用什么名称

我试过这个:

JTextField.getDocument.addChangeListener()
:比较长度和插入符号位置。 似乎可用,但我无法区分键入的用户输入和对
JTextField.setText(String)
的调用

当通过gui刷新更改文本时,不应更改焦点

您认为实现这一点的最佳方式是什么?

也许您希望改为使用组件。您仍然可以检查长度和插入符号位置,但它仅在按下/键入键时才会触发

您的代码可能类似于以下内容:

addKeyListener(new KeyAdapter(){
    public void keyTyped(KeyEvent e) {
        if (getText().length() >= MAX_LENGTH) {
            // Move the focus
        }
    }
});
根据评论进行编辑:
我可能建议使用@camickr的建议:

private DocumentListener myTabChangeListener;
@Override
public void setText(String text) {
    getDocument().removeDocumentListener(myTabChangeListener);
    super.setText(text);
    getDocument().addDocumentListener(myTabChangeListener);
}

在侦听器中,创建一个标志isAPI,以区分是否是您的代码调用setText()。在setText()调用之前将标志设置为true,并在调用之后将其重置

如果是真的,则什么也不做,并在相反的情况下移动焦点。

请参阅

当通过gui刷新更改文本时,不应更改焦点

a) removeListener
b) setText
c) addListener

编辑:


如果您真的不喜欢需要ChainDocumentFilter的概念,那么就去掉对该类的所有引用。如果需要,可以用Toolkit.beep()替换provideErrorFeedback()方法调用。

这无法正常工作,因为在处理此keyTyped事件时,文档尚未更新。我可以在长度中添加“1”,但这不包括粘贴操作(CTRL-V),因为长度已经正确。@Synox,是的,这就是我创建我引用的类的原因。一般来说,您不应该使用KeyListeners。它们与使用低级API的旧AWT应用程序一起使用。Swing更高级,具有更高级别的API,使生活更轻松。