下面是一个粗略的 DocumentFilter,它似乎可以工作。它的基本方法是让插入/追加发生,事后查询行数,如果超过最大值,则酌情从开头删除行。
当心:使用 textArea 方法计算的行数是(很可能是等待@Stani 确认)lines-between-cr,而不是布局的实际行。根据您的确切要求,它们可能适合您,也可能不适合您(如果不适合,请使用 Stan 的实用方法)
我很惊讶,不完全确定它是否安全
- 惊讶:没有调用 insert 方法,而是需要实现 replace 方法(在生产就绪代码中可能两者都有)
- 不确定是否保证 textArea 在过滤器方法中返回最新值(可能不是,那么长度检查可以包含在 invokeLater 中)
一些代码:
public class MyDocumentFilter extends DocumentFilter {
private JTextArea area;
private int max;
public MyDocumentFilter(JTextArea area, int max) {
this.area = area;
this.max = max;
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
super.replace(fb, offset, length, text, attrs);
int lines = area.getLineCount();
if (lines > max) {
int linesToRemove = lines - max -1;
int lengthToRemove = area.getLineStartOffset(linesToRemove);
remove(fb, 0, lengthToRemove);
}
}
}
// usage
JTextArea area = new JTextArea(10, 10);
((AbstractDocument) area.getDocument()).setDocumentFilter(new MyDocumentFilter(area, 3));