Melhorar jPasswordField

3 respostas
Onimatsu

Boa tarde amigos programadores.
Estou com uma dúvida cruel queria saber se é possível em java passar uma mensagem dentro de jPasswordField e exibi-la como se fosse um jTextField, por exemplo, eu tenho uma tela onde o usuário têm que digitar a senha e eu estou usando aquele campo formatado jPasswordField até aí tranquilo agora o que eu quero fazer nesse campo é mostrar a mensagem “Digite sua senha”, ou seja, em vez de usar jLabel eu quero escrever dentro do campo onde o usuário vai digitar.
Então eu fiz :

campoSenha.setText("Digite sua senha...");Só que ele exibe o texto no formato pontilhado do jPasswordField.
Então eu faço a pergunta é possível configurar um campo de senha dessa forma, se for de que jeito?

3 Respostas

E
package guj;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;
import javax.swing.text.*;

/**
 * The TextPrompt class will display a prompt over top of a text component when the Document of the text field is empty.
 * The Show property is used to determine the visibility of the prompt.
 * 
 * The Font and foreground Color of the prompt will default to those properties of the parent text component. You are
 * free to change the properties after class construction.
 */
public class TextPrompt extends JLabel implements FocusListener, DocumentListener {
    public enum Show {
        ALWAYS, FOCUS_GAINED, FOCUS_LOST;
    }

    private JTextComponent component;
    private Document document;

    private Show show;
    private boolean showPromptOnce;
    private int focusLost;

    public TextPrompt(String text, JTextComponent component) {
        this(text, component, Show.ALWAYS);
    }

    public TextPrompt(String text, JTextComponent component, Show show) {
        this.component = component;
        setShow(show);
        document = component.getDocument();

        setText(text);
        setFont(component.getFont());
        setForeground(component.getForeground());
        setBorder(new EmptyBorder(component.getInsets()));
        setHorizontalAlignment(JLabel.LEADING);

        component.addFocusListener(this);
        document.addDocumentListener(this);

        component.setLayout(new BorderLayout());
        component.add(this);
        checkForPrompt();
    }

    /**
     * Convenience method to change the alpha value of the current foreground Color to the specifice value.
     * 
     * @param alpha value in the range of 0 - 1.0.
     */
    public void changeAlpha(float alpha) {
        changeAlpha((int) (alpha * 255));
    }

    /**
     * Convenience method to change the alpha value of the current foreground Color to the specifice value.
     * 
     * @param alpha value in the range of 0 - 255.
     */
    public void changeAlpha(int alpha) {
        alpha = alpha > 255 ? 255 : alpha < 0 ? 0 : alpha;

        Color foreground = getForeground();
        int red = foreground.getRed();
        int green = foreground.getGreen();
        int blue = foreground.getBlue();

        Color withAlpha = new Color(red, green, blue, alpha);
        super.setForeground(withAlpha);
    }

    /**
     * Convenience method to change the style of the current Font. The style values are found in the Font class. Common
     * values might be: Font.BOLD, Font.ITALIC and Font.BOLD + Font.ITALIC.
     * 
     * @param style value representing the the new style of the Font.
     */
    public void changeStyle(int style) {
        setFont(getFont().deriveFont(style));
    }

    /**
     * Get the Show property
     * 
     * @return the Show property.
     */
    public Show getShow() {
        return show;
    }

    /**
     * Set the prompt Show property to control when the promt is shown. Valid values are:
     * 
     * Show.AWLAYS (default) - always show the prompt Show.Focus_GAINED - show the prompt when the component gains focus
     * (and hide the prompt when focus is lost) Show.Focus_LOST - show the prompt when the component loses focus (and
     * hide the prompt when focus is gained)
     * 
     * @param show a valid Show enum
     */
    public void setShow(Show show) {
        this.show = show;
    }

    /**
     * Get the showPromptOnce property
     * 
     * @return the showPromptOnce property.
     */
    public boolean getShowPromptOnce() {
        return showPromptOnce;
    }

    /**
     * Show the prompt once. Once the component has gained/lost focus once, the prompt will not be shown again.
     * 
     * @param showPromptOnce when true the prompt will only be shown once, otherwise it will be shown repeatedly.
     */
    public void setShowPromptOnce(boolean showPromptOnce) {
        this.showPromptOnce = showPromptOnce;
    }

    /**
     * Check whether the prompt should be visible or not. The visibility will change on updates to the Document and on
     * focus changes.
     */
    private void checkForPrompt() {
        // Text has been entered, remove the prompt

        if (document.getLength() > 0) {
            setVisible(false);
            return;
        }

        // Prompt has already been shown once, remove it

        if (showPromptOnce && focusLost > 0) {
            setVisible(false);
            return;
        }

        // Check the Show property and component focus to determine if the
        // prompt should be displayed.

        if (component.hasFocus()) {
            if (show == Show.ALWAYS || show == Show.FOCUS_GAINED)
                setVisible(true);
            else
                setVisible(false);
        } else {
            if (show == Show.ALWAYS || show == Show.FOCUS_LOST)
                setVisible(true);
            else
                setVisible(false);
        }
    }

    // Implement FocusListener

    public void focusGained(FocusEvent e) {
        checkForPrompt();
    }

    public void focusLost(FocusEvent e) {
        focusLost++;
        checkForPrompt();
    }

    // Implement DocumentListener

    public void insertUpdate(DocumentEvent e) {
        checkForPrompt();
    }

    public void removeUpdate(DocumentEvent e) {
        checkForPrompt();
    }

    public void changedUpdate(DocumentEvent e) {
    }
}

Um exemplo do uso dessa classe:

package guj;

import java.awt.BorderLayout;

public class TesteJTextField extends JFrame {

    private static final long serialVersionUID = 1L;
    private JPanel jContentPane = null;
    private JPanel pnlTextField1 = null;
    private JPanel pnlTextField2 = null;
    private JPanel pnlTextField3 = null;
    private JTextField txtField1 = null;
    private JPasswordField pwField = null;
    private JTextField txtField3 = null;

    /**
     * This method initializes pnlTextField1
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getPnlTextField1() {
        if (pnlTextField1 == null) {
            pnlTextField1 = new JPanel();
            pnlTextField1.setLayout(new BorderLayout());
            pnlTextField1.setBorder(BorderFactory.createTitledBorder("Text Field 1"));
            pnlTextField1.add(getTxtField1(), BorderLayout.CENTER);
        }
        return pnlTextField1;
    }

    /**
     * This method initializes pnlTextField2
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getPnlTextField2() {
        if (pnlTextField2 == null) {
            pnlTextField2 = new JPanel();
            pnlTextField2.setLayout(new BorderLayout());
            pnlTextField2.add(getTxtField2(), BorderLayout.CENTER);
            pnlTextField2.setBorder(BorderFactory.createTitledBorder("Text Field 2"));
        }
        return pnlTextField2;
    }

    /**
     * This method initializes pnlTextField3
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getPnlTextField3() {
        if (pnlTextField3 == null) {
            pnlTextField3 = new JPanel();
            pnlTextField3.setLayout(new BorderLayout());
            pnlTextField3.add(getTxtField3(), BorderLayout.CENTER);
            pnlTextField3.setBorder(BorderFactory.createTitledBorder("Text Field 3"));
        }
        return pnlTextField3;
    }

    /**
     * This method initializes txtField1
     * 
     * @return javax.swing.JTextField
     */
    private JTextField getTxtField1() {
        if (txtField1 == null) {
            txtField1 = new MeuJTextField();
            TextPrompt tp1 = new TextPrompt("Entre o nome do usuário", txtField1);
        }
        return txtField1;
    }

    /**
     * This method initializes pwField
     * 
     * @return javax.swing.JPasswordField
     */
    private JPasswordField getTxtField2() {
        if (pwField == null) {
            pwField = new JPasswordField();
            TextPrompt tp2 = new TextPrompt("Senha, por obséquio", pwField);
        }
        return pwField;
    }

    /**
     * This method initializes txtField3
     * 
     * @return javax.swing.JTextField
     */
    private JTextField getTxtField3() {
        if (txtField3 == null) {
            txtField3 = new MeuJTextField();
        }
        return txtField3;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                TesteJTextField thisClass = new TesteJTextField();
                thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                thisClass.setVisible(true);
            }
        });
    }

    /**
     * This is the default constructor
     */
    public TesteJTextField() {
        super();
        initialize();
    }

    /**
     * This method initializes this
     * 
     * @return void
     */
    private void initialize() {
        this.setSize(300, 243);
        this.setContentPane(getJContentPane());
        this.setTitle("Exemplo JTextField");
    }

    /**
     * This method initializes jContentPane
     * 
     * @return javax.swing.JPanel
     */
    private JPanel getJContentPane() {
        if (jContentPane == null) {
            jContentPane = new JPanel();
            jContentPane.setLayout(new BoxLayout(getJContentPane(), BoxLayout.Y_AXIS));
            jContentPane.add(getPnlTextField1(), null);
            jContentPane.add(getPnlTextField2(), null);
            jContentPane.add(getPnlTextField3(), null);
        }
        return jContentPane;
    }

}


Onimatsu

Obrigado pelo exemplo, mas sou iniciante e não entendi direito como aplicar tudo nesse meio tempo tentei separar o que eu posso utilizar, por exemplo, fiz uma janela em pelo netBeans com jPassordField chamado campoSenha no evento focusLost conforme o código.
Daí surge mais uma dúvida como eu recupero o valor para o campoSenha?

private void campoSenhaFocusLost(java.awt.event.FocusEvent evt) { if (campoSenha.getText().equals("")) { TextPrompt tp1 = new TextPrompt("Digite a senha...", campoSenha); tp1.setShow(TextPrompt.Show.FOCUS_LOST); // como retornar a jPassword ? } }

E

TextPrompt não deve ser usado para pegar a senha. Ele deve ser usado APENAS na hora de criar o seu JPasswordField, porque ele só dá esse “efeito visual” no JPasswordField.
Não é para pôr no FocusLost.

Leia o meu programa com mais atenção.

Seu JPasswordField continua funcionando do mesmo jeito (ou seja, para pegar a senha, use new String (seuJPasswordField.getPassword()) )

Criado 22 de outubro de 2012
Ultima resposta 22 de out. de 2012
Respostas 3
Participantes 2