在使用DocumentFilter后向JTextArea添加文本



我是一个有问题的附加文本到JTextArea后使用DocumentFilter,在文本从文件上传之后,我需要在JTextArea上附加一个字符串,并从另一个JFrame的JTextArea返回一个字符串到指定的JTextArea

当我不使用DocumentFilter时,一切都工作得很好。FilterBypass,直到我添加它。它仍然可以工作一点,但只有在没有添加逗号(,)或空格(" ")的情况下。这不是我得到的规范。

我该如何解决这个问题?或者有没有算法或实现不会出现这个问题?

这是用于过滤长度的insertString代码,并且只允许空格和逗号

public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException {
    // if (string == null || string.trim().equals("") || string.equals(","))
    // {
    // return;
    // }
    if (isNumeric(string)) {
        // if (this.length > 0 && fb.getDocument().getLength() +
        // string.length()
        // > this.length) {
        // return;
        // }
        if (fb.getDocument().getLength() + string.length() > this.length || string.trim().equals("") || string.equals(",")) {
            this.insertString(fb, offset, string, attr);
        }
        // if (string == null || string.trim().equals("") ||
        // string.equals(",")) {
        // return;
        // }
        super.insertString(fb, offset, string, attr);
    }
    else if (string == null || string.trim().equals("") || string.equals(",")) {
        super.insertString(fb, offset, string, attr);
    }
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException {
    if (isNumeric(text)) {
        if (this.length > 0 && fb.getDocument().getLength() + text.length() > this.length) {
            return;
        }
        super.insertString(fb, offset, text, attrs);
    }
}
/**
 * This method tests whether given text can be represented as number. This
 * method can be enhanced further for specific needs.
 * 
 * @param text
 *            Input text.
 * @return {@code true} if given string can be converted to number;
 *         otherwise returns {@code false}.
 */
private boolean isNumeric(String text) {
    if (text == null || text.trim().equals("") || text.equals(",")) {
        return true;
    }
    for (int iCount = 0; iCount < text.length(); iCount++) {
        if (!Character.isDigit(text.charAt(iCount))) {
            return false;
        }
    }
    return true;
}

其他两个函数(从文件&我想通过将它们的字符串值附加到使用此过滤的JTextArea来实现。但是被super.insertString(.....)拒绝

我不太明白你的问题。如果你想有一个过滤器,你可以粘贴完整的数字或","和空白(结束或开始或输入),但不能粘贴任何其他文本,你可以改变你的isNumeric函数:

private boolean isNumeric(String text) {
   text = text.trim();
   if(",".equals(text)) return true;
   ParsePosition position = new ParsePosition(0);
   java.text.NumberFormat.getNumberInstance().parse(text, position);
   return position.getIndex() == text.length();
}

您可能需要在附加文本之前获得克拉位置。我不熟悉DocumentFilters,我假设this.append("stringzzz")方法不可用?

似乎你的偏移量有问题。您可能需要先设置它以获得一个位置,如下所示。InsertString() Doc (OffSet)

至于获得克拉位置,您可以执行类似TextPane.getCaretPosition(),的操作并将其传递进去。而不是使用FilterByPass?

类似于(在我的链接中建议)

this.insertString(TextArea.getCaretPosition(), yourString, null);

这是一个链接,可能会有所帮助。

插入没有FilterByPass的文本

如果我说得不对,请告诉我

最新更新