gpt4 book ai didi

java - 自定义文档过滤器 - "Invalid remove"异常

转载 作者:行者123 更新时间:2023-11-30 04:32:54 26 4
gpt4 key购买 nike

我创建了自己的 DocumentFormat,即用分号分隔的整数列表。解析字符串等工作正常,但是当我想用新字符串替换整个文本时会出现问题。

调用 super.replace(fb, 0, out.length(), out, attrs); 时出现异常无效删除。谁能解释一下这条消息吗?

这是我的类(class)代码:

import java.util.ArrayList;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;

public class IntsFilter extends DocumentFilter {

@Override
public void insertString(FilterBypass fb, int offset, String string,
AttributeSet attr) throws BadLocationException {
// Do nothing so far
}

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

Boolean test = false;

try {
Integer.parseInt(text);
test = true;
} catch (NumberFormatException e) {
test = text.equals(";");
}

if (!test) return;

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

ArrayList<String> data = toArray(sb.toString());
System.out.println(arrayToString(data));
String out = arrayToString(data);

try {
super.replace(fb, 0, out.length(), out, attrs);
} catch (Exception e) {
System.out.println(e.getMessage());
}

}

@Override
public void remove(FilterBypass fb, int offset, int length)
throws BadLocationException {

try {
super.remove(fb, offset, length);
} catch (Exception e) {
System.out.println(e.getMessage());
}
// TODO: uzupełnić

}

protected String arrayToString(ArrayList<String> input) {

String result = "";

for (int i=0; i<input.size(); i++) {

if (i == input.size() - 1)
result += input.get(i).equals("0") ? "" : input.get(i);
else
result += input.get(i) + "; ";

}

return result;

}

protected ArrayList<String> toArray(String input) {

input = input.replaceAll(";$", "; 0");

ArrayList<String> list = new ArrayList<String>();

for (String part : input.replaceAll("\\s", "").split(";")) {
try {
Integer.parseInt(part);
list.add(part);
} catch (NumberFormatException e) {}
}

return list;

}

}

最佳答案

如果偏移量+长度大于文档的当前长度,则会发生该错误。请勿自行更换。让父类(super class)来做吧。将 super.replace() 调用移至测试之后。

关于java - 自定义文档过滤器 - "Invalid remove"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14200236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com