JPasswordField

15 respostas
NewWave

Galera, depois de quase ficar doido, resolvi postar a dúvida aqui!
O que há de errado com esse código? Ele não compila! Dá uma mensagem de erro na linha "passwd.JPass...", "The method JPasswordField(String) is undefined for the type JPasswordField". Eu não entendo o que ele quer dizer com esta mensagem de erro. Poderiam me dar uma luz? Na realidade, este é um código reduzido de um programa maior!

import javax.swing.*;

public class PassWdTest extends JPasswordField {

	public static void main(String[] args) {
		JPasswordField passwd = new JPasswordField();
		passwd.JPasswordField("Teste");

	}

}

15 Respostas

gqferreira

Olá, tudo bem?

Eu não entendi muito bem o que você quer fazer, é colocar o valor “Teste” como o valor do campo?

Se for, basta fazer assim:

JPasswordField passwd = new JPasswordField("Teste");

Qual o motivo de estender a classe para um JPasswordField?

NewWave

Olá!

O meu objetivo, na realidade, é fazer uma caixa abrir com um campo para digitar um passwd, acompanhada de uma mensagem do tipo “digite sua senha”, mas isso não está sendo possível!
O motivo de ter estendido a classe foi uma tentativa desesperada de fazer funcionar, uma vez que eu interpretei a mensagem de erro como sendo “Você está tentando abrir um método numa classe a qual ele não pertence”, entende? Essa dica me foi dada por um colega de trabalho, mas que não funcionou.
E no final das contas, a sua dica também não funcionou, infelizmente. :frowning:
Teria como analisar de novo o problema?

Agradeço! :wink:
Abraço!

gqferreira
Veja se assim funciona pra você:
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testes;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;


/**
 *
 * @author Gustavo
 */
public class Senha extends JFrame implements ActionListener {

    private JLabel lbSenhaInformada;
    private JLabel lbInformacao;
    private JButton btInformarSenha;

    public static void main(String[] args) {
        new Senha().setVisible(true);
    }

    public Senha() {
        //Tamanho da tela
        this.setSize(400, 300);
        //Para matar a aplicacao ao fechar o frame
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("Eu so a tela principal");
        //Centraliza
        this.setLocationRelativeTo(null);
        //Nao redimensiona
        this.setResizable(false);
        //Tela sem gerenciador de layout... pesquise depois sobre Layout Manager
        this.setLayout(null);

        this.lbInformacao = new JLabel("Clique no botão abaixo para informar a senha");
        this.lbInformacao.setBounds(10, 10, 300, 25);

        this.btInformarSenha = new JButton("Informar senha");
        this.btInformarSenha.setBounds(10, 50, 200, 25);
        this.btInformarSenha.addActionListener(this);

        this.lbSenhaInformada = new JLabel("Senha informada: ");
        this.lbSenhaInformada.setBounds(10, 100, 200, 25);

        this.add(btInformarSenha);
        this.add(lbInformacao);
        this.add(lbSenhaInformada);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        List<String> parametros = new ArrayList<String>();
        new DialogSenha(parametros).setVisible(true);
        lbSenhaInformada.setText("Senha informada: "+parametros.get(0).toString());
    }
}
class DialogSenha extends JDialog implements ActionListener{
    private List<String> senha;
    private JPasswordField pfSenha;
    
    public DialogSenha(List<String> senha){
        this.senha = senha;
        this.setTitle("Informe a sua senha");
        this.setLayout(null);
        this.setSize(300,200);
        this.setLocationRelativeTo(null);
        //Nao deixa clicar em nada atraz enquanto nao fechar o dialog
        this.setModal(true);

        pfSenha = new JPasswordField();
        pfSenha.setBounds(10, 10, 100, 25);

        JButton btConfirmarSenha = new JButton("OK");
        btConfirmarSenha.setBounds(10, 50, 80, 25);
        btConfirmarSenha.addActionListener(this);
        
        this.add(btConfirmarSenha);
        this.add(pfSenha);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        this.senha.add(new String(pfSenha.getPassword()));
        System.out.println(this.senha.get(0));
        this.dispose();
    }
}

Copie tudo e cole em um arquivo chamado Senha.java.
Obs.: Eu coloquei duas classes num mesmo arquivo propositalmente para ficar mais didático, depois veja como separa-las.

Spammer
NewWave:
Galera, depois de quase ficar doido, resolvi postar a dúvida aqui! O que há de errado com esse código? Ele não compila! Dá uma mensagem de erro na linha "passwd.JPass...", "The method JPasswordField(String) is undefined for the type JPasswordField". Eu não entendo o que ele quer dizer com esta mensagem de erro. Poderiam me dar uma luz? Na realidade, este é um código reduzido de um programa maior!
import javax.swing.*;

public class PassWdTest extends JPasswordField {

	public static void main(String[] args) {
		JPasswordField passwd = new JPasswordField();
		passwd.JPasswordField("Teste");

	}

}

Tente isto

setLayout(new FlowLayout());
		setSize(200, 300);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);		
		JLabel text = new JLabel("Test");
		JPasswordField pass = new JPasswordField(10);		
		add(text);
		add(pass);
NewWave

gqferreira, por curiosidade: esta resposta já estava pronta em algum arquivo seu ou você escreveu tudo isso personalizado pra mim?
Outra coisa: a simples classe JPasswordField demanda tanto código assim? É REALMENTE necessário escrever tudo isso para se obter o resultado esperado?

Spammer: porque a tua solução foi mais sucinta que a do gqferreira?

[confuso]

Ainda assim, mesmo copiando e colando, ainda vou ter que me virar pra entender cada linha do código que eu for copiar, uma vez que o meu objetivo é aprender. Também gostaria de entender o porque do meu código não ter funcionado. Pra mim é muito estranho. Podem me ajudar com estas dúvidas?

MUITO OBRIGADO AOS DOIS!

NewWave

Ainda estão vivos? :slight_smile:
Heheheheheh…

marcoacsilva

NewWave…a resposta do gqferreira foi com a caixa de dialogo completa.

Pelo que vi, ela incluiu dois jlabel, um campo de password e um botão.

Trocando em miudos, você cria a tela, coloca a mensagem que quer no JLabel e coloca a caixa de password.

Do jeito que você estava fazendo, não funciona pois você está chamando um construtor como método. Isso é impossivel.

E, quando você faz isso: JPasswordField passwd = new JPasswordField("Teste");

A unica coisa que irá acontecer é que o passwordfield virá com um valor já preenchido (neste caso, estará escrito Teste).

Tente explicar melhor o seu objetivo para que possamos ajudá-lo. Você quer que essa mensagem apareça para o usuário de que maneira? Já escrita na caixa de Password? Se for isso, já temos um problema pois uma JPasswordField vem, por padrão, com uma mascara onde qualquer valor digitado é coberto com circulos pretos. Então, virá realmente escrito na caixa, porém não poderá ser visualisado. Nesses casos, coloque a mensagem em um Label para apresentar ao usuário. É muito mais simples, rápido e prático.

NewWave

Olá, amigos!
Bom dia a todos!

Em primeiro lugar, desculpem a falta de clareza nos meus objetivos. Acreditem, o tempo é foda! Por isso eu preciso ser o mais sucinto possível nas minhas perguntas.
Mas, desta vez eu tô com mais tempo e vou tentar ser o mais claro e granular possível.
Acontece que eu tô [tentando] fazendo um programa de controle de orçamento doméstico. Contas a pagar, receber, etc. Ao mesmo tempo, eu tô tentando aprender Java com isso. Já fiz uma janela com as dimensões que eu queria e gostaria de chamar um código que requeresse uma senha de login antes que essa janela fosse exibida na tela, embora ela não manipulasse evento nenhum, por enquanto, só mesmo o fato dela receber uma string com máscara e permitir o clique do OK aparecendo uma mensagem no título "Teste"ou melhor ainda “Digite a sua senha:”, tava de bom tamanho. Assim que ela fosse fechada a janela apareceria. Isso tudo, por hora. Depois a gente bota ela pra capturar eventos.
Perguntei sobre a resposta do gqferreira porque achei ela muito bem trabalhada. Se ele teve que escrever tudo aquilo pra me ajudar, fiquei até constrangido em ter incomodado.
Quanto a resposta do Spammer, ainda não implementei porque não tive tempo. Vou fazer isso agora, assim que terminar de postar esta mensagem.
Quanto ao construtor, até me toquei disso, mas foi o que eu entendi do livro. Lá diz que JPasswordField(String) cria uma caixa de texto com a string dada. (Java 7 Ensino didático - Furgeri, Sérgio - Ed. Érica, p.140).
Pois bem. Vou disponibilizar aqui o código que eu tô trabalhando para que vocês analisem.

//Principal.java

public class Principal {

	/**
	 * @author Jent Digital Solutions [www.jent.com.br]
	 * @param args
	 */
	public static void main(String[] args) {
		JentWindow window = new JentWindow();
		JentPasswdBox passbox = new JentPasswdBox();
		
		
		/**
		 * Instantiates a window by Jent's default, passing a string like a title,
		 * one boolean order EXIT_ON_CLOSE, width window and heigth window 
		 */
		passbox.instPwdBox("Teste");
		window.instWindow("MoneyMine :: Controle de orçamento doméstico"+
				" :: Jent Software [Distribuído sob licença LGPL]", true, 800, 600);
		
	} //end of main

}//end of Principal


//JentWindow.java

import javax.swing.JFrame;
//import javax.swing.JMenu;
//import javax.swing.JMenuBar;
/**
 * 
 * @author Jent Digital Solutions
 * @param
 *
 */
public class JentWindow {
	
	public void instWindow(String JentTitle, boolean jexit, int jwidth, int jheigth){
		JFrame frame = new JFrame(JentTitle);

	if (jexit == true) {
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	frame.setSize(jwidth, jheigth);
	frame.setVisible(true);
	}
}


//JentPasswordBox.java

import javax.swing.JPasswordField;

public class JentPasswdBox {
	
	public void instPwdBox(String msg){
		JPasswordField passbox = new JPasswordField(msg);
		JPasswordField(msg);
		//JOptionPane.showMessageDialog(null, msg); //Apenas um pequeno teste; isto aparece normalmente.
	}
	

}

Bom essa doideira aí em cima foi a minha tentativa. Espero que o meu nível de clareza desta vez tenha sido satisfatório.
Um grande abraço a todos! :smiley:

gqferreira

NewWave:
Olá, amigos!
Perguntei sobre a resposta do gqferreira porque achei ela muito bem trabalhada. Se ele teve que escrever tudo aquilo pra me ajudar, fiquei até constrangido em ter incomodado.

Não precisa ficar incomodado… eu realmente escrevi tudo aquilo mas o CTR+Barra ajuda (hehe :lol: :lol: )

Então táh… acho que agora entendi:

1 - Inicia o programa
2 - Aparece telinha pedindo senha
3 - Autentica e abre janela principal

Isso?

A noite eu exemplifico pra você, é que agora to sem tempo.

A propósito, o autor desse livro que você está lendo foi meu professor de Java, duas vezes ainda… no técnico e na faculdade (hahaha)

gqferreira

Cara... pelo que entendi do seu código, você tem três classes, uma pro JPasswordFiel, outra pro JFrame e um principal que deveria unir as duas. Você instancia a classe do frame e a do componente mas não adiciona o componente no frame, assim ele nunca aparecerá.
Você não precisa criar uma classe por causa de um componente.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package testes;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;


/**
 *
 * @author Gustavo
 */
public class Senha extends JFrame {

    public static void main(String[] args) {
        new DialogSenha().setVisible(true);
    }

    public Senha() {
        //Tamanho da tela
        this.setSize(600, 400);
        //Para matar a aplicacao ao fechar o frame
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("Eu so a tela principal");
        //Centraliza
        this.setLocationRelativeTo(null);
        //Nao redimensiona
        this.setResizable(false);
        //Tela sem gerenciador de layout... pesquise depois sobre Layout Manager
        this.setLayout(null);
    }
}
class DialogSenha extends JFrame implements ActionListener{
    
    private JLabel lbSenha;
    private JPasswordField pfSenha;
    private JButton btConfirmarSenha;
    
    public DialogSenha(){
        this.setTitle("Senha");
        this.setLayout(null);
        this.setSize(150,150);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        lbSenha = new JLabel("Informe sua senha");
        lbSenha.setBounds(10,10, 120, 15);
        
        pfSenha = new JPasswordField();
        pfSenha.setBounds(10, 30, 100, 25);

        btConfirmarSenha = new JButton("OK");
        btConfirmarSenha.setBounds(10, 70, 100, 25);
        btConfirmarSenha.addActionListener(this);
        
        this.add(btConfirmarSenha);
        this.add(pfSenha);
        this.add(lbSenha);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        String senha = new String(pfSenha.getPassword());
        if (senha.equals("admin")){
            new Senha().setVisible(true);
            this.dispose();
        }
        else{
            JOptionPane.showMessageDialog(null, "Senha incorreta!", "Senha", JOptionPane.ERROR_MESSAGE);
        }
    }
}

Se eu entendi corretamente, isso faz o que você precisa

NewWave

Usou o Ctrl+Space? Assim é trapaça!!! Kkkkkkkkkkkkkkkkkkkkkkk…
Cara, ainda assim foi muito trabalho! Muito obrigado pela ajuda!

Vou dar um tempo nas postagens do tópico. Vou ler o código, analisar direitinho, tentar entender, linha por linha, e só depois postar algo aqui. Se eu tiver alguma dúvida, posso perguntar? (sem querer abusar, mas já abusando!)

Grande abraço a todos!
Fiquem com Deus!

S

NewWave,

Curiosamente estou desenvolvendo um projeto similar ao seu, sobre controle de finanças, onde tera cadastro de contas a pagar, receber, etc =]

estou apanhando bastante tambem em umas partes e inclusive ja inclui alguns posts aqui. Como a principio o objetivo de nossas aplicacoes eh o mesmo, talvez um dos posts que ja criei e o pessoal respondeu me ajudando possa te ajudar tambem!

NewWave

Vou ficar de olho no teu projeto, então! Pode me passar links relativos?
Aí vai o link do meu projeto:
http://code.google.com/p/moneymine/

NewWave

Amigos, finalmente estou com tempo para analisar este código.
Na linha 23 eu tenho uma dúvida:

new DialogSenha().setVisible(true);

Eu já estudei sobre esta sintaxe em algum lugar, mas não lembro do que se trata. Já tentei achar aqui nos livros, mas não encontrei. Não se trata de “new”, que eu sei que instancia um novo objeto. Se trata de “DialogSenha().setVisible(true);”. Sou familiarizado com a sintaxe de C/C++, e esse tipo de construção não existe lá. O que eu estou enxergando aí é uma função (ou método, como queiram) chamando uma subfunção que passa true como parâmetro. Obviamente que eu devo estar enganado, lógico. Alguém poderia me explicar o que está acontecendo? O que eu entendo, alálogo ao C++, seria uma função sendo chamada através do seu objeto, como em “objetoQualquer.umaFuncaoDoObjeto();”, sem os parênteses do primeiro elemento.
Aguardo respostas.
Me desculpem a ignorância.

PS: Linha 43: this.setLayout(null); Li sobre o tal gerenciador de LayOut! Obrigado pela dica! Isso eu já havia visto em Qt/C++. Show de bola!
PS 2: Linha 41: this.setResizable(false); Excelente dica!

NewWave

Up…

Criado 17 de outubro de 2012
Ultima resposta 16 de nov. de 2012
Respostas 15
Participantes 5