У меня есть текстовое поле в приложении.Несмотря на то, что это текстовое поле, пользователи иногда вставляют в него огромное количество текста.Кроме того, другие функции проблемы также устанавливают большие суммы.
Иногда бывает так много текста, что JVM получает нарушение прав доступа в fontmanager.dll.Похоже, Oracle не заинтересован в устранении самой проблемы, поэтому я хотел бы, по крайней мере, попытаться ее избежать.
Ограничение объема текста, вводимого пользователем, очевидно, неприемлемо (в противном случае это будетнаиболее очевидное решение), но допустимо разрешить его установку, а затем отключить текстовое поле.Когда текст связан с моделью, он должен снова содержать полный текст.
Поскольку это по сути ошибка в представлении, я решил, что исправление должно быть в представлении, а не работать вокругэто в модели и добавление туда дополнительных свойств.
Моя первая попытка прошла примерно так:
public class LimitedTextField extends JTextField {
static final int LIMIT = 10000;
private String fullString;
@Override
public void setText(String text) {
if (text != null && text.length() > LIMIT) {
fullString = text;
setEnabled(false);
} else {
fullString = null;
super.setText(text);
setEnabled(true);
}
}
@Override
public String getText() {
if (fullString != null) {
return fullString;
} else {
return super.getText();
}
}
}
Это проходит наивные юнит-тесты, но как только я написал дополнительный тест для BeansBindingЯ обнаружил, что это не работает, потому что BeansBinding не привязывается к свойству text, а привязывается к Document, имитируя свойство text.Так что на самом деле getText () всегда возвращает пустую строку в этом тесте.
Сейчас я пытаюсь создать реализацию Document, которая будет делать то, что я хочу, но, конечно, нелегко сделать этот видтрюк на уровне документа.Я вижу все имеющиеся у него методы, но не могу найти хороший способ ограничить текст, не сделав его недоступным при вызове getText ().