以下は、機能しているように見える大まかなDocumentFilterです。その基本的なアプローチは、挿入/追加を実行させ、事後の行数を照会し、最大値を超える場合は、必要に応じて最初から行を削除することです。
注意:textAreaメソッドでカウントされる行は、レイアウトされた実際の行ではなく、(おそらく@Staniからの確認を待っている)行-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));