Панель прокрутки не имеет к этому никакого отношения.Вы можете ограничить данные, хранящиеся в PlainDocument, который используется JTextArea.Я думаю, что DocumentFilter мог бы использоваться для этой цели.
Редактировать 1
Вот простая DocumentFilter версия кода camickr (Роб: извините за выходи воровство!).
import javax.swing.text.*;
public class LimitLinesDocumentFilter extends DocumentFilter {
private int maxLineCount;
public LimitLinesDocumentFilter(int maxLineCount) {
this.maxLineCount = maxLineCount;
}
@Override
public void insertString(FilterBypass fb, int offset, String string,
AttributeSet attr) throws BadLocationException {
super.insertString(fb, offset, string, attr);
removeFromStart(fb);
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text,
AttributeSet attrs) throws BadLocationException {
super.replace(fb, offset, length, text, attrs);
removeFromStart(fb);
}
private void removeFromStart(FilterBypass fb) {
Document doc = fb.getDocument();
Element root = doc.getDefaultRootElement();
while (root.getElementCount() > maxLineCount) {
removeLineFromStart(doc, root);
}
}
private void removeLineFromStart(Document document, Element root) {
Element line = root.getElement(0);
int end = line.getEndOffset();
try {
document.remove(0, end);
} catch (BadLocationException ble) {
ble.printStackTrace();
}
}
}
И код для проверки:
import javax.swing.*;
import javax.swing.text.PlainDocument;
public class LimitLinesDocumentFilterTest {
private static void createAndShowUI() {
int rows = 10;
int cols = 30;
JTextArea textarea = new JTextArea(rows , cols );
PlainDocument doc = (PlainDocument)textarea.getDocument();
int maxLineCount = 9;
doc.setDocumentFilter(new LimitLinesDocumentFilter(maxLineCount ));
JFrame frame = new JFrame("Limit Lines Document Filter Test");
frame.getContentPane().add(new JScrollPane(textarea));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}