Java 如何使用DocumentFilter将空字符串自动更改为0?

Java 如何使用DocumentFilter将空字符串自动更改为0?,java,swing,documentfilter,Java,Swing,Documentfilter,我想确保我的JTextField中始终有一个正整数。例如,在创建GUI时,JTextField当前有一个默认值“1”,我希望它能够在用户决定点击backspace时自动将文本设置为“0”,而不是变为空文本字段。这是因为文本字段还有一个侦听器,它调用一个方法来根据这个数字更新GUI的另一部分 我对DocumentFilter还很陌生,所以我甚至不确定自己的方向是否正确,但以下是我目前掌握的情况: public class IntegerFilter extends DocumentFilter {

我想确保我的JTextField中始终有一个正整数。例如,在创建GUI时,JTextField当前有一个默认值“1”,我希望它能够在用户决定点击backspace时自动将文本设置为“0”,而不是变为空文本字段。这是因为文本字段还有一个侦听器,它调用一个方法来根据这个数字更新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()方法,并检查用户删除的数字是否是最后一个。如果不是这样,那么delete将正常工作,但如果是这样,那么什么也不会发生

我想我遇到的问题是,我想在remove方法中调用replace方法,但我没有AttributeSet来处理

//我在想是否有什么东西可以放在这里

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

您要做的是:

  • 始终调用
    super.remove(…)
    从文档中删除数字
  • 然后需要获取文档以确定文档中还有多少位。如果该值为零,则可以调用DocumentFilter的super.insertString(…)方法来插入要插入到文档中的任何值
  • 我没有可用的属性集

    对于JTextField,
    AttributeSet
    将为空

    //我在想是否有什么东西可以放在这里

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

    您要做的是:

  • 始终调用
    super.remove(…)
    从文档中删除数字
  • 然后需要获取文档以确定文档中还有多少位。如果该值为零,则可以调用DocumentFilter的super.insertString(…)方法来插入要插入到文档中的任何值
  • 我没有可用的属性集


    对于JTextField,
    AttributeSet
    将为空。

    “我想确保我的JTextField中始终有一个正整数……”
    new JSpinner(new SpinnerNumberModel(5,11000000,1))
    Hmm这很有趣,我以前没有看过JSpinner。因此,如果我想实现和增加和减少JSpinner号按钮,那么它应该已经内置了“…内置了吗?”测试这一点只需要两行代码。
    JSpinner
    后面没有文档吗?我无法将它强制转换为
    AbstractDocument
    并调用
    getDocument()
    ,就像我使用
    JTextField
    一样,“JSpinner后面没有文档吗?”它有一个(微调器编号)模型。“我想确保我的jtexfield中始终有一个正整数…”
    新的JSpinner(新的微调器编号)模型(5,11000000,1))
    Hmm这很有趣,我以前没有看过JSpinner。因此,如果我想实现和增加和减少按钮,JSpinner的数字应该已经内置了?“…内置了吗?”测试这一点不需要超过两行代码。
    JSpinner
    后面没有文档吗?我无法将它转换为
    AbstractDocument
    并调用
    getDocument()
    ,就像我使用
    JTextField
    时一样,“JSpinner后面没有文档吗?”它有一个(微调器编号)模型。哦,我没有想到补偿的情况!这很好,谢谢。哦,我没有想到补偿的情况!这很好,谢谢。