La verdad es que no tengo muy claro porqué no me funcionaba antes, pero el caso es que ya lo he resuelto, aunque de una forma distinta. El super.insertString(arg0,arg1,arg2) es una llamada al método de PlainDocument para insertar normalmente un String en un campo de texto. Explico como lo tengo hecho por si alguien tiene un problema similar:
Lo he dejado con JTextField y hago una "emulación de JPasswordField", usando una variable que llamo "guardado" donde voy metiendo el String de entrada (y borrando, modificando o lo que haga falta), mientras que por pantalla sólo saco "*" por cada pulsación. Después tomo el password de esa variable y ¡listos!
Dejo aquí el limitador de texto al completo:
*****************************************************************
package pwd;
import javax.swing.*;
import javax.swing.text.*;
class LimitadorTexto extends PlainDocument {
/**
* El editor del que estamos limitando el texto.
*/
private JTextField editor;
static final long serialVersionUID=0;
private String guardado="";
/**
* Crea una instancia de LimitadorTexto
*
* @param editor Editor en el que se quiere limitar el texto
*/
public LimitadorTexto(JTextField editor)
{
this.editor=editor;
}
/**
* Método al que llama el editor cada vez que se intenta insertar caracteres.
* El método comprueba que se ha introducido alguna '/'. Si no es así no
* permite escribir y si se intenta escribir otra '/' borra todo lo anterior
* a esa última
*/
public void insertString(int arg0, String arg1, AttributeSet arg2) throws BadLocationException
{
// Si no había '/' antes ni la metemos ahora no escribe
if ((getGuardado().indexOf('/')==-1)&&!(arg1.equals("/"))){
return;
}
// Si había '/' y metemos otra borramos lo anterior
if ((getGuardado().indexOf('/')!=-1)&&(arg1.equals("/"))){
super.insertString(arg0, "*", arg2);
super.remove(0,editor.getText().lastIndexOf("*"));
setGuardado(arg1);
}else{
if (arg0==10){
//Se borra todo si se meten más de 10 caracteres;
//Esto es útil para que no se pueda bloquear con una
//pulsación prolongada
editor.setText("");
setGuardado("");
}
setGuardado(guardado+arg1);
super.insertString(arg0, "*", arg2);
}
}
public String getGuardado() {
return guardado;
}
public void setGuardado(String guardado) {
this.guardado = guardado;
}
}
*****************************************************************
Salu2 y gracias por vuestro tiempo!