Swing/FIFODocument のバックアップの現在との差分(No.8)
TITLE:JTextAreaに表示できる行数を制限
JTextAreaに表示できる行数を制限
編集者:Terai Atsuhiro~
作成日:2006-02-27
更新日:2021-12-31 (金) 01:43:36
概要
ドキュメントのサイズを一定にして、JTextArea
など表示できる行数を制限します。Swing (Archive) - JTextArea Memory Overflow ??にあるソースコードを参考にしています。
Screenshot
Advertisement
概要
ドキュメントのサイズを一定にして、JTextAreaなど表示できる行数を制限します。JTextArea Memory Overflow ??にあるソースコードを参考にしています。サンプルコード
#spanend
#spanadd
jta.setEditable(false);
#spanend
#spanadd
jta.getDocument().addDocumentListener(new DocumentListener() {
#spanend
@Override public void insertUpdate(DocumentEvent e) {
final Document doc = jta.getDocument();
final Element root = doc.getDefaultRootElement();
if (root.getElementCount() <= maxLines) return;
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
removeLines(doc, root);
}
});
jta.setCaretPosition(doc.getLength());
}
#spandel
#screenshot
#spanend
private void removeLines(Document doc, Element root) {
Element fl = root.getElement(0);
try {
doc.remove(0, fl.getEndOffset());
} catch (BadLocationException ble) {
System.out.println(ble);
}
}
#spandel
**サンプルコード [#x24ef034]
#spanend
#spandel
#code{{
#spanend
jta.setEditable(false);
jta.getDocument().addDocumentListener(new DocumentListener() {
public void insertUpdate(DocumentEvent e) {
final Document doc = jta.getDocument();
final Element root = doc.getDefaultRootElement();
if(root.getElementCount()<=maxLines) return;
SwingUtilities.invokeLater(new Runnable() {
public void run() {
removeLines(doc, root);
}
});
jta.setCaretPosition(doc.getLength());
}
private void removeLines(Document doc, Element root) {
Element fl = root.getElement(0);
try{
doc.remove(0, fl.getEndOffset());
}catch(BadLocationException ble) {
System.out.println(ble);
}
}
public void removeUpdate(DocumentEvent e) {}
public void changedUpdate(DocumentEvent e) {}
});
final Timer timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s = new Date().toString();
jta.append((jta.getDocument().getLength()>0)?"\n"+s:s);
}
});
@Override public void removeUpdate(DocumentEvent e) {}
#spanadd
#spanend
@Override public void changedUpdate(DocumentEvent e) {}
#spanadd
});
#spanend
#spanadd
Timer timer = new Timer(100, () -> {
#spanend
String s = new Date().toString();
jta.append((jta.getDocument().getLength() > 0) ? "\n" + s : s);
#spanadd
});
#spanend
View in GitHub: Java, Kotlin- &jnlp;
- &jar;
- &zip;
解説
一行追加された時に、規定の行数を越えている場合は、先頭から一行を削除しています。解説
上記のサンプルでは、1
行追加した時に規定の行数を越えている場合、先頭の1
行を削除するDocumentListener
を作成し、これをJTextArea
に設定しています。
上記のサンプルでは、10行以上になると先頭行から削除されていきます。また、複数行の入力やペーストには対応していません。それらにも対応する場合は、JTextArea Memory Overflow ??を参考にしてみてください。
-
10
行以上になると先頭行から削除 - 複数行テキストのペーストには未対応
- 参考: Swing (Archive) - JTextArea Memory Overflow ??は複数行貼り込みに対応している
-
DocumentListener
ではなく以下のようなDocumentFilter
を設定する方法もある#spanend #spanadd ((AbstractDocument) ta.getDocument()).setDocumentFilter(new FIFODocumentFilter()); #spanend #spanadd // ... #spanend #spanadd class FIFODocumentFilter extends DocumentFilter { #spanend private static final int MAX_LINES = 10; @Override public void insertString( DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr) throws BadLocationException { fb.insertString(offset, string, attr); Element root = fb.getDocument().getDefaultRootElement(); if (root.getElementCount() > MAX_LINES) { fb.remove(0, root.getElement(0).getEndOffset()); } } #spanadd } #spanend #spanadd
参考リンク
参考リンク
コメント
- sample実行できないよ -- cinik?
- jnlpファイルの名前をsampleからexampleに変更しているので、一旦キャッシュを消してみるとうまくいくかもしれません。(じゃなくてExceptionなどが発生しているのでしょうか?) -- terai
コメント
-
sample
実行できないよ -- cinik-
jnlp
ファイルの名前をsample
からexample
に変更しているので、一旦キャッシュを消してみるとうまくいくかもしれません。(そうではなくException
などが発生しているのでしょうか?) -- aterai
-