Swing - Tornar senha do JPasswordField visível

Olá caros colegas,

Estou com a seguinte situação: Sistema em swing, tenho um campo JPasswordField e gostaria de fazer como em alguns sistemas web e botar um botãozinho do lado “show” para tornar a senha visível,
tem alguma propriedade do JPasswordField que mande ele mostrar a senha sem os “*”?? ví que da para mudar o echo, esse asterisco por outro char, mas não achei como não ter isso.

Alguem sabe alguma forma de fazer?

Por padrão não.
Provavelmente você precise criar algo que estenda o JPasswordField e implementar esta rotina.

Se você usar JPasswordField.setEchoChar(’\u0000’) os caracteres aparecerão normalmente:

http://docs.oracle.com/javase/6/docs/api/javax/swing/JPasswordField.html#setEchoChar(char)

1 curtida

Valeu Roger, é exatamente isso mesmo, e desculpe a displição de não visto isso antes de postar, li rapidamente os métodos da doc, devo ter passado reto nisso.

att, Daniel Dias

Que interessante, não sabia disso. Fiz um exemplo, funciona direitinho.

O Javadoc é um bocadinho chato de entender, ele diz “0” mas você poderia entender que é o caracter ‘0’ (ASCII 48 ) em vez de ser o caracter ‘\u0000’ (ASCII 0). Rodando o exemplo abaixo, você vê que tem de ser ‘\u0000’.

package guj;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JButton;
import javax.swing.JPasswordField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ExemploRevelarJPasswordField extends JFrame {
    private JPanel panel;
    private JButton btnRevelar;
    private JButton btnEsconder;
    private JPasswordField passwordField;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ExemploRevelarJPasswordField frame = new ExemploRevelarJPasswordField();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public ExemploRevelarJPasswordField() {
        setTitle("Exemplo: Revelar JPasswordField");
        setBounds(100, 100, 450, 105);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(getPanel(), BorderLayout.SOUTH);
        getContentPane().add(getPasswordField(), BorderLayout.CENTER);

    }

    private JPanel getPanel() {
        if (panel == null) {
            panel = new JPanel();
            panel.add(getBtnRevelar());
            panel.add(getBtnEsconder());
        }
        return panel;
    }

    private JButton getBtnRevelar() {
        if (btnRevelar == null) {
            btnRevelar = new JButton("Revelar");
            btnRevelar.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    if (passwordField.getEchoChar() != '\u0000')
                        previousEchoChar = passwordField.getEchoChar();
                    passwordField.setEchoChar('\u0000');
                }
            });
        }
        return btnRevelar;
    }

    private JButton getBtnEsconder() {
        if (btnEsconder == null) {
            btnEsconder = new JButton("Esconder");
            btnEsconder.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    passwordField.setEchoChar(previousEchoChar);
                }
            });
        }
        return btnEsconder;
    }

    private JPasswordField getPasswordField() {
        if (passwordField == null) {
            passwordField = new JPasswordField();
            passwordField.setText("Hello, world!");
        }
        return passwordField;
    }

    private char previousEchoChar = '\u2022';
}

ficou massa mlq, valeu pela contribuição pro post… realmente eles colocaram esse 0 meio confuso lá na doc. Voce pode usar ‘\u0000’ ou pode usar o int mesmo dando parse "(char)0"
o meu ficou:

		JCheckBox chckbxShow = new JCheckBox("mostrar");
		chckbxShow.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if(passwordField.getEchoChar() == '*'){
					passwordField.setEchoChar((char) 0);
				}else{
					passwordField.setEchoChar('*');
				}
			}
		});