• Miércoles 13 de Noviembre de 2024, 08:07

Autor Tema:  Jtextfield Que Actúe Como Jpasswordfield  (Leído 3147 veces)

apokalychys

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Jtextfield Que Actúe Como Jpasswordfield
« en: Domingo 30 de Julio de 2006, 20:10 »
0
Hola, tengo un problema que quizá vosotros sepáis resolver de forma sencilla:
Uso un limitador de texto siguiendo el hilo de un foro de estas páginas y va muy bien (yo lo uso para una aplicación en la que se necesita meter un password entre una '/' y un '*' sin pulsar enter y no hacer caso a cualquier otra cosa). Además le he añadido alguna funcionalidad más como que si se tardan 5 segundos en pulsar una tecla se borra todo lo anterior o que si se mete otra '/' también se borra todo.
El caso es que ahora también necesito, al ser un campo de password, que no se vean los caracteres pulsados, y para ello necesitaría las características de un JPasswordField, pero al cambiar el JTextField por JPasswordField y los getText() por getPassword().toString() no se introducen correctamente los caracteres al llamar a super.insertString(arg0,arg1,arg2).

¿Tiene solución?

Aquí tengo el Limitador con JTextField:


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;

/**
* 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 ((editor.getText().indexOf('/')==-1)&&!(arg1.equals("/"))){
return;
}
// Si había '/' y metemos otra borramos lo anterior
if ((editor.getText().indexOf('/')!=-1)&&(arg1.equals("/"))){
super.insertString(arg0, arg1, arg2);
super.remove(0,editor.getText().lastIndexOf('/'));
}else{
super.insertString(arg0, arg1, arg2);
}
}
}

silverfox

  • Miembro MUY activo
  • ***
  • Mensajes: 280
    • Ver Perfil
Re: Jtextfield Que Actúe Como Jpasswordfield
« Respuesta #1 en: Lunes 31 de Julio de 2006, 11:50 »
0
Citar
getPassword().toString()

¿¿¿Qué resultado te da eso???

me temo que un char[] no puede convertirse en String por las buenas...

Bueno, sí, pero la forma correcta de hacerlo es con el constructor de cadenas

String (char[]);



En todo caso, si no cambiases nada del código, debería funcionar tanto con el JTextField como con el JPasswordField, porque el segundo es subclase del primero. Lo único que debería es dar una advertencia de getText deprecated en JPasswordField.


De todas formas, necesitaríamos saber qué método es el super.insertString(arg0, arg1, arg2); para ayudarte algo más y cuál es el fallo que tienes al insertar el texto del JPassword.


Un saludo.




Silvefox

apokalychys

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Jtextfield Que Actúe Como Jpasswordfield
« Respuesta #2 en: Lunes 31 de Julio de 2006, 18:21 »
0
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!  :kicking:

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!