Tengo un campo de texto en mi aplicación. A pesar de ser un campo de texto, los usuarios a veces pegan grandes cantidades de texto en él. Además, otras funciones del problema establecen grandes cantidades también.¿Puedo limitar la longitud del texto en un JTextField que se puede pintar, mientras se almacena el texto completo?
A veces hay tanto texto que la JVM obtiene una infracción de acceso en fontmanager.dll. Oracle no parece estar interesado en solucionar el problema en sí, así que al menos quiero tratar de evitarlo.
Limitar la cantidad de texto que el usuario ingresa aparentemente no es aceptable (de lo contrario, esta sería la solución más obvia), pero es aceptable permitir que se establezca y luego deshabilitar el campo de texto. Cuando el texto está vinculado al modelo, debe contener el texto completo nuevamente.
Dado que esto es intrínsecamente un error en la vista, pensé que la solución debería estar en la vista, en lugar de trabajar en el modelo y agregar las propiedades adicionales allí.
Mi primer intento fue algo como esto:
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();
}
}
}
Esto no pasan las pruebas de unidad ingenuas, pero una vez que escribí una prueba adicional para BeansBinding, he encontrado que no funciona porque no se une BeansBinding a la propiedad de texto, sino que se une al documento, simulando una propiedad de texto. Entonces getText() siempre devuelve una cadena vacía en esa prueba.
Ahora estoy tratando de hacer una implementación de documento que haga lo que quiero, pero seguro que no es fácil hacer este tipo de truco a nivel de documento. Puedo ver todos los métodos que tiene, pero no puedo encontrar una buena manera de limitar el texto sin también hacer que ese texto no esté disponible al llamar a getText().