如何使用DocumentFilter自动将空String更改为0?

时间:2015-12-21 18:23:34

标签: java swing documentfilter

我想确保我的JTextField中始终存在正整数。例如,当创建GUI时,JTextField当前有一个默认的“1”,我希望如果用户决定点击退格,而不是成为一个空文本字段,我希望它自动将文本设置为“ 0" 。原因是因为text字段还有一个监听器,它调用一个方法来保持GUI的另一部分根据这个数字更新。

我对DocumentFilter很陌生,所以我甚至不确定我是否朝着正确的方向前进,但到目前为止,这是我的目标:

public class IntegerFilter extends DocumentFilter {

    public void remove(FilterBypass fb, int offs,
        int len) throws BadLocationException {

        if (offs == 0) {
            // I'm trying to think if there's something I can put here
        } else {
            super.remove(fb, offs, len);
        }
    }

    public void replace(FilterBypass fb, int offs, int len, String str,
        AttributeSet a) throws BadLocationException {

        String text = fb.getDocument().getText(0, fb.getDocument().getLength());
        text += str;
        if (text.matches("\\d+")) {
            super.replace(fb, offs, len, str, a);
        }
    }
}

截至目前,我正在覆盖过滤器的remove()方法,并检查用户正在删除的数字是否是最后一个。如果没有,则删除按常规方式工作,但如果是,则没有任何反应。

我认为我遇到的问题是我想在remove方法中调用replace方法,但我没有使用AttributeSet。

1 个答案:

答案 0 :(得分:4)

  

//我正在考虑是否有可以放在这里的东西

首先,你的基本逻辑是错误的。你不能只检查偏移量。你可以在文本字段中有5个数字,只是试图删除第一个数字。

您想要做的是:

  1. 始终调用super.remove(...)以从文档中删除数字
  2. 然后您需要获取文档以确定文档中仍有多少位数。如果值为零,则可以调用DocumentFilter的super.insertString(...)方法,以插入要插入Document的任何值。
  3.   

    我没有使用AttributeSet。

    对于JTextField,AttributeSet将为null。