【问题标题】:JTextField: focus next component when textfield is full / autoskip / Auto-TabbingJTextField:当文本字段已满/自动跳过/自动制表时聚焦下一个组件
【发布时间】:2011-01-27 14:35:08
【问题描述】:

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

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

我试过了:

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

通过 gui-refresh 更改文本时不应更改焦点。

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

【问题讨论】:

    标签: java swing jtextfield


    【解决方案1】:

    也许你想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);
    }
    

    【讨论】:

    • 这不能正常工作,因为在处理这个keyTyped-Event时,文档还没有更新。我可以将“1”添加到长度,但这不会涵盖长度已经正确的粘贴操作 (CTRL-V)。
    • @Synox,是的,这就是我创建引用的类的原因。作为一般规则,您永远不应该使用 KeyListeners。它们与使用低级 API 的旧 AWT 应用程序一起使用。 Swing 更高级,具有更高级别的 API,让生活更轻松。
    【解决方案2】:

    Text Field Auto Tab

    通过 gui-refresh 更改文本时不应更改焦点。

    a) 移除监听器
    b) 设置文本
    c) 添加监听器

    编辑:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-11
        • 2018-11-05
        • 1970-01-01
        • 2012-09-08
        • 2012-10-25
        • 1970-01-01
        • 2014-12-26
        • 1970-01-01
        相关资源
        最近更新 更多