当前位置: 首页 > 面试题库 >

如何设置具有输入长度和范围的DocumentFilter?例如1-3或10-80

丁钟展
2023-03-14
问题内容

我正在使用DocumentFilter将输入限制为整数或十进制。我在这里发布的代码对此非常有效。

有人可以帮助我如何限制给定代码中的输入长度或范围吗?

谢谢!!

class MyIntFilter extends DocumentFilter {
public void insertString(FilterBypass fb, int offset, String string,
     AttributeSet attr) throws BadLocationException {

  Document doc = fb.getDocument();
  StringBuilder sb = new StringBuilder();

  sb.append(doc.getText(0, doc.getLength()));
  sb.insert(offset, string);

  if (test(sb.toString())) {
     super.insertString(fb, offset, string, attr);
  } else {
     // warn the user and don't allow the insert
  }
}

private boolean test(String text) {
  try {
     Integer.parseInt(text);
     return true;
  } catch (NumberFormatException e) {
     return false;
  }
}

@Override
public void replace(FilterBypass fb, int offset, int length, String text,
     AttributeSet attrs) throws BadLocationException {

  Document doc = fb.getDocument();
  StringBuilder sb = new StringBuilder(2);
  sb.append(doc.getText(0, doc.getLength()));
  sb.replace(offset, offset + length, text);

  if (test(sb.toString())) {
     super.replace(fb, offset, length, text, attrs);
  } else {
     // warn the user and don't allow the insert
  }

}

 @Override
 public void remove(FilterBypass fb, int offset, int length)
     throws BadLocationException {
  Document doc = fb.getDocument();
  StringBuilder sb = new StringBuilder(2);
  sb.append(doc.getText(0, doc.getLength()));
  //sb.append(doc.getText(0, 2));
  sb.delete(offset, offset + length);

  if (test(sb.toString())) {
     super.remove(fb, offset, length);
  } else {
     // warn the user and don't allow the insert
  }

}


}

问题答案:

您可能想测试一下(我还没有测试过),但是基本思路应该可以帮助您入门。

同时查看文档过滤器示例

至于设置的最小长度,你可能想使用InputVerifier,以及

class MyIntFilter extends DocumentFilter {

    private int maxLength = 0;

    public void setMaxLength(int maxLength) {
        this.maxLength = maxLength;
    }

    public int getMaxLength() {
        return maxLength;
    }

    public void insertString(FilterBypass fb, int offset, String string,
                    AttributeSet attr) throws BadLocationException {

        Document doc = fb.getDocument();
        StringBuilder sb = new StringBuilder();

        sb.append(doc.getText(0, doc.getLength()));
        sb.insert(offset, string);

        if (maxLength > 0 && doc.getLength() + string.length() <= maxLength) {
            if (test(sb.toString())) {
                super.insertString(fb, offset, string, attr);
            } else {
                // warn the user and don't allow the insert
            }
        }
    }

    private boolean test(String text) {
        try {
            Integer.parseInt(text);
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    @Override
    public void replace(FilterBypass fb, int offset, int length, String text,
                    AttributeSet attrs) throws BadLocationException {

        Document doc = fb.getDocument();
        StringBuilder sb = new StringBuilder(2);
        sb.append(doc.getText(0, doc.getLength()));
        sb.replace(offset, offset + length, text);

        if (test(sb.toString())) {
            if (sb.length() > maxLength) {
                length = sb.length() - maxLength;
                if (length > 0) {
                    text = text.substring(0, length);
                    super.replace(fb, offset, length, text, attrs);
                }
            }
        } else {
            // warn the user and don't allow the insert
        }

    }

    @Override
    public void remove(FilterBypass fb, int offset, int length)
                    throws BadLocationException {
        Document doc = fb.getDocument();
        StringBuilder sb = new StringBuilder(2);
        sb.append(doc.getText(0, doc.getLength()));
        //sb.append(doc.getText(0, 2));
        sb.delete(offset, offset + length);

        if (test(sb.toString())) {
            super.remove(fb, offset, length);
        } else {
            // warn the user and don't allow the insert
        }

    }
}


 类似资料:
  • 问题内容: 我有这个功能(将代码示例的HTML标记剥离)从CSV构建HTML表,但是每次尝试运行它时都会遇到运行时错误,但我不知道为什么。谷歌说,也许编码有些错误,但是我不知道如何更改。 我的CSV以ANSI编码,并包含ä,Ä,Ü,Ö等字符,但我无法控制编码,或者将来是否会更改。 错误发生在这里: 121行是 源代码: 问题答案: 您可以尝试通过使用方法(javadocs)的形式来利用正确的编码。

  • 我的最终目标是打乱矩阵的行(我使用代数)。 为了解决这个问题,我需要设置数组的可变范围(片)。假设我有一个数组(假设它是一个3x3矩阵): 我提取了一行,如下所示: 现在,对于knuth shuffle,我需要用另一行交换这个。我需要做的是: 但是,这样做失败了: 例子:http://is.gd/ULkN6j

  • 我目前正在用下面的代码从Google表单中获取所有值,但是在从那里获取所有值之后,现在如何在另一个表单中设置它们呢? var ss=电子表格应用程序。openById(ID); var值=ss。getDataRange()。getValues(); var ss1=电子表格应用程序。openById(ID1); 我没能做到,有没有办法用for循环做到?

  • 问题内容: 我正在实验室中运行Linux(Debian和Ubuntu)。用户名和组名由NIS和yp处理。我们有一些普通用户,每个人都可以访问该用户来运行实验,然后我们每个人都有自己的用户,此外还有一个共同的组,我们都是该组的成员。 如何使用户/组读取/写入(/可执行)共享驱动器(NFS)上的所有文件和目录?基本上我想要的是 或等效地。 但是运行以上命令只能修复文件夹中的当前文件,而umask仅适用

  • 我的理解是, 函数实际上是 Python 3 中的一种对象类型,它动态生成其内容,类似于生成器。 在这种情况下,我预计下一行将花费大量时间,因为为了确定1万亿()是否在范围内,必须生成1万亿值: 此外:似乎无论我添加多少个零,计算或多或少都需要相同的时间(基本上是瞬时的)。 我也尝试过类似的方法,但计算仍然几乎是即时的: 如果我尝试实现我自己的范围函数,结果就不太好了! 对象在引擎盖下做什么使它如

  • 我希望每个框中都有新的日期范围,但它只返回最后一个文本框的日期范围。我也使文本框id的动态,但我仍然面临着这个问题。我有每个文本框的开始日期和结束日期,我用PHP计算了开始日期和结束日期的日期范围,并禁用了用户在开始日期和日期中选择的所有日期,所有这些日期都正常工作,但它返回了datepicker中禁用的最后一个文本框日期。 这是截图- 示例图像 用于datepicker的Javascript函数