Swing - Tornar senha do JPasswordField visível

5 respostas
D

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?

5 Respostas

D

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

R

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)

D

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

E

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';
}
D

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('*');
				}
			}
		});
Criado 27 de novembro de 2012
Ultima resposta 27 de nov. de 2012
Respostas 5
Participantes 4