2011-01-27 72 views
3

我想用JTextField实现自动跳过,但不知道最好的方式是做什么。JTextField:当文本字段已满/自动跳过/自动跳转时关注下一个组件

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

我尝试这样做:

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

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

您认为最好的实现方式是什么?

回答

1

请参阅Text Field Auto Tab

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

一)的removeListener
B)的setText
C)的addListener

编辑:

如果你真的不喜欢的需要的ChainDocumentFilter的概念,然后摆脱所有引用到那个班。如果需要,可以使用Toolkit.beep()替换provideErrorFeedback()方法调用。

3

也许你想add aKeyListener而不是组件。您仍然可以检查长度和插入位置,但只有在按下/键入键时才会触发。

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

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

这不能正常工作,因为处理此keyTyped-Event时,文档尚未更新。我可以在长度上添加“1”,但这不包括Paste-Actions(CTRL-V),其中长度已经是正确的。 – Synox 2011-01-28 09:57:04

+0

@Synox,看我的编辑。 – jjnguy 2011-01-28 13:39:15

0

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

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