JTextField:当textfield为full / autoskip / Auto-Tabbing时,关注下一个组件

时间:2011-01-27 14:35:08

标签: java swing jtextfield

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

什么是autoskip / Auto-Tabbing?达到文本字段的已定义长度限制后,将自动转到下一个字段。 (比如按下Tab键,关注下一个组件)或者你使用什么名称来表达这种行为?

我试过了:

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

当gui-refresh更改文本时,不应更改焦点。

您认为实施此方法的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

或许您希望add a KeyListener代替组件。您仍然可以检查长度和插入位置,但只有在按下/键入键时才会触发。

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

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);
}

答案 1 :(得分:1)

请参阅Text Field Auto Tab

  

当gui-refresh更改文本时,不应更改焦点。

a)removeListener
b)setText
c)addListener

编辑:

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

答案 2 :(得分:0)

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

什么都不做,并在相反的情况下移动焦点。