Я использую JTextArea в JScrollPane
Я хочу ограничить максимальное количество возможных строк и максимальное число символов в каждой строке.
Мне нужно, чтобы строка была точно такой же, как на экране, каждая строка будет заканчиваться символом '\ n' (если после нее будет другая строка), и пользователь сможет вставлять только X строк и Y символов в каждой строке .
Я пытался ограничить строки, но я не знаю точно, сколько строк у меня из-за переноса строк. Обтекание строк запускает новую строку визуально на экране (из-за ширины JTextArea), но в строка компонента - это на самом деле та же самая строка без '\ n' для обозначения новой строки. У меня нет идеи, как ограничить максимальное число символов в каждой строке при вводе.
Есть 2 этапа:
- Ввод строки - учтите, что пользователь не сможет набирать более X строк и Y символов в каждой строке. (даже если строка переносится только визуально или пользователь вводит '/ n')
- Вставьте строку в БД - после нажатия кнопки «ОК» преобразуйте строку, чтобы каждая строка заканчивалась на «/ n», даже если пользователь не набрал ее, а строка была перенесена только визуально.
Есть несколько проблем, если я посчитаю символы в строке и вставлю '/ n' в конце строки, поэтому я решил сделать это в два этапа. На первом этапе пользователь печатает, я бы предпочел только ограничить его визуально и вызвать перенос строк или что-то подобное. Только на втором этапе, когда я сохраняю строку, я добавлю '/ n', даже если пользователь не набрал ее в конце строк!
У кого-нибудь есть идея?
Я знаю, что мне придется использовать DocumentFilter ИЛИ StyledDocument.
Вот пример кода, который ограничивает только строки 3: (но не символы в строке до 19)
private JTextArea textArea ;
textArea = new JTextArea(3,19);
textArea .setLineWrap(true);
textArea .setDocument(new LimitedStyledDocument(3));
JScrollPane scrollPane = new JScrollPane(textArea
public class LimitedStyledDocument extends DefaultStyledDocument
/** Field maxCharacters */
int maxLines;
public LimitedStyledDocument(int maxLines) {
maxCharacters = maxLines;
}
public void insertString(int offs, String str, AttributeSet attribute) throws BadLocationException {
Element root = this.getDefaultRootElement();
int lineCount = getLineCount(str);
if (lineCount + root.getElementCount() <= maxLines){
super.insertString(offs, str, attribute);
}
else {
Toolkit.getDefaultToolkit().beep();
}
}
/**
* get Line Count
*
* @param str
* @return the count of '\n' in the String
*/
private int getLineCount(String str){
String tempStr = new String(str);
int index;
int lineCount = 0;
while (tempStr.length() > 0){
index = tempStr.indexOf("\n");
if(index != -1){
lineCount++;
tempStr = tempStr.substring(index+1);
}
else{
break;
}
}
return lineCount;
}
}