.getText[RESOLVIDO]

Bom dia pessoal,
então, sou iniciante no java e novo aqui no fórum. :smiley:
Estou aprendendo java com a apostila da caelum(fj11), porém surgiu um pequeno problema no meu programa e não estou conseguindo resolvê-lo.
Bom, vamos ao que interessa.

Situação:
Estou aprendendo manipulação de arquivo e no meu simples programa, tenho 4 classes, são elas: teste(main),senha,validaSenha,telaPrincipal.
A idéia é simples, faço o login e acesso minha classe telaPrincipal, entretanto, a validação do login é feita através da consulta de um arquivo para comparar e validar o usuário e senha.

Segue a classe.

package Login;
import javax.swing.;
import java.awt.
;
import java.awt.event.*;
import Validar.ValidaSenha;

public class Senha extends JFrame {

private JLabel lbNome, lbSenha;
private JTextField tfNome, tfResultado;
private JPasswordField tfSenha;
private JButton botao;
private JPanel painel, painel2;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem sair;

private String nome;
private String senha;

ValidaSenha validaSenha = new ValidaSenha();
	
public Senha() {
	lbNome = new JLabel("Nome:");
	tfNome = new JTextField(10);
	lbSenha = new JLabel("Senha:");
	tfSenha = new JPasswordField(10);
	botao = new JButton("Enviar");
	tfResultado = new JTextField(10);
	painel = new JPanel(new GridLayout(2, 0));
	painel2 = new JPanel();
	menuBar = new JMenuBar();
	menu = new JMenu("Menu");
	sair = new JMenuItem("Sair");

	this.setTitle("Login");
	tfResultado.setEditable(false);

	menu.add(sair);
	menuBar.add(menu);
	this.setJMenuBar(menuBar);
	painel.add(lbNome);
	painel.add(tfNome);
	painel.add(lbSenha);
	painel.add(tfSenha);
	painel2.add(botao);
	this.add(painel, "North");
	this.add(painel2, "Center");
	this.setVisible(true);
	this.pack();
	this.setResizable(false);
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);

	painel.setBackground(Color.LIGHT_GRAY);
	painel2.setBackground(Color.LIGHT_GRAY);
	tfNome.setBackground(Color.WHITE);
	tfSenha.setBackground(Color.WHITE);
	
	this.nome=tfNome.getText();  //   <---------------------------- acho que aqui está o problema.
	this.senha=tfSenha.getText();//    <---------------------------- e aqui também.
                            
                            /**Quando fiz um teste para ver o que estava sendo atribuído para as duas variáveis, simplismente não imprimiu nada.
                             Por isso, quando comparo seus valores com os que estão no arquivo sempre retorna um "false". */
			
	botao.addActionListener(new ActionListener() {		 
		public void actionPerformed(ActionEvent e) {
			if(validaSenha.Validar()==true)
			new TelaPrincipal().show();
			else{
				JOptionPane.showMessageDialog(null, "Login ou senha incorreto");
				tfNome.setText(null);
				tfSenha.setText(null);
			}
		}
	});
	sair.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			System.exit(0);
		}
	});
}

public String getNome()
{
	return this.nome;
}
public String getSenha()
{
	return this.senha;
}

}

Segue também a classe validaSenha.

package Validar;

import java.io.*;
import Login.Senha;

public class ValidaSenha {

public boolean Validar(){
	try
	{
		
		InputStream arq = new FileInputStream("C:/Documents and Settings/E003810/arquivo.txt");
		InputStreamReader isr = new InputStreamReader(arq);
		BufferedReader br = new BufferedReader(isr);
		String s = br.readLine();
		
		Senha senha = new Senha();

		if(senha.getNome().equals(s.substring(0,4))&& senha.getSenha().equals(s.substring(4,9)))
		{
			return true;
		}
		
		br.close();
				
	}catch(IOException e){
		
		System.out.println("Erro"+e);
		
	}
	
	return false;
}

}

Espero que eu tenha sido claro e conciso(pelo menos nas dúvidas).
Abraços…=]

1- Quando for postar código use aa tag “Code” para melhor vizualização do codigo

http://www.guj.com.br/posts/list/50115.java

olhe:

package Login;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import Validar.ValidaSenha;

public class Senha extends JFrame {

private JLabel lbNome, lbSenha;
private JTextField tfNome, tfResultado;
private JPasswordField tfSenha;
private JButton botao;
private JPanel painel, painel2;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem sair;

private String nome;
private String senha;

ValidaSenha validaSenha = new ValidaSenha();

public Senha() {
lbNome = new JLabel("Nome:");
tfNome = new JTextField(10);
lbSenha = new JLabel("Senha:");
tfSenha = new JPasswordField(10);
botao = new JButton("Enviar");
tfResultado = new JTextField(10);
painel = new JPanel(new GridLayout(2, 0));
painel2 = new JPanel();
menuBar = new JMenuBar();
menu = new JMenu("Menu");
sair = new JMenuItem("Sair");

this.setTitle("Login");
tfResultado.setEditable(false);

menu.add(sair);
menuBar.add(menu);
this.setJMenuBar(menuBar);
painel.add(lbNome);
painel.add(tfNome);
painel.add(lbSenha);
painel.add(tfSenha);
painel2.add(botao);
this.add(painel, "North");
this.add(painel2, "Center");
this.setVisible(true);
this.pack();
this.setResizable(false);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);

painel.setBackground(Color.LIGHT_GRAY);
painel2.setBackground(Color.LIGHT_GRAY);
tfNome.setBackground(Color.WHITE);
tfSenha.setBackground(Color.WHITE);

this.nome=tfNome.getText(); // <---------------------------- acho que aqui está o problema.
this.senha=tfSenha.getText();// <---------------------------- e aqui também.

/**Quando fiz um teste para ver o que estava sendo atribuído para as duas variáveis, simplismente não imprimiu nada.
Por isso, quando comparo seus valores com os que estão no arquivo sempre retorna um "false". */

botao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(validaSenha.Validar()==true)
new TelaPrincipal().show();
else{
JOptionPane.showMessageDialog(null, "Login ou senha incorreto");
tfNome.setText(null);
tfSenha.setText(null);
}
}
});
sair.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
}

public String getNome()
{
return this.nome;
}
public String getSenha()
{
return this.senha;
}

}


Segue também a classe validaSenha.

package Validar;

import java.io.*;
import Login.Senha;

public class ValidaSenha {

public boolean Validar(){
try
{

InputStream arq = new FileInputStream("C:/Documents and Settings/E003810/arquivo.txt");
InputStreamReader isr = new InputStreamReader(arq);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();

Senha senha = new Senha();

if(senha.getNome().equals(s.substring(0,4))&& senha.getSenha().equals(s.substring(4,9)))
{
return true;
}

br.close();

}catch(IOException e){

System.out.println("Erro"+e);

}

return false;
}

} 

Melhor assim neh

2- Você postou o código mas não falou qual a sua dúvida.

acho que a lógica ta errada, vc ta usando a atribuição de senha do campo txt no próprio construtor da senha, ai ele cria em vazio e atribui em vazio.

vc ta usando:

tfSenha = new JPasswordField(10);
e logo em baixo:
this.senha=tfSenha.getText();

separa a classe Senha apenas seus atributos: nome e senha

a classe senha não deve conter toda a parte gráfica

você pode até usar um construtor mais ele não criaria os campos, e sim usaria getText nos campos “ja criados e preenchidos” da tela.

Exatamente como o Douglas disse acima.

Eu rodei seu código aqui.

E como ele disse, você tenta pegar algum valor logo após criar o campo, ou seja não tem nada preenchido.

E tente separar a crição dos campos do resto do código.

Se você usa o NetBeans pode desenhar toda a parte gráfica que ele gera o código e no lugar certo, vai ficar bem mais facil de você vizualizar e compreender o código, ainda mais quando se começa a programar

Opa, me desculpem, não havia lido esse post de como postar, falha minha.

Então, a respeito da dúvia, é o seguinte…
Nas linhas 59 e 60(que eu deixei como comentário), onde antes eu atribuia o valor de tfNome e tfSenha(JTextField e JPasswordField respectivamente), entendi o que vocês explicaram e realmente, eu estaria atribuindo a elas um valor nulo.
Bom, tentei mudar, deixando para atribuir o valor que consta dentro do tfNome e tfSenha dentro do evento(nas linhas 64 e 65), entretanto, agora está dando um nullPointerExcepiton.

Realmente fiquei confuso, meus passos foram simples…
1-Criar dois atributos que recebam o valor de tfNome(JTextField) e tfSenha(JPasswordField).
2-Comparar com as informações do arquivo.
3-Abrir uma nova tela.

Andei testando as classes e corrigi alguns erros e realmente só restou esse erro de como atribuir o valor aos atributos para que eu possa comparar com os dados do arquivo.
A dúvida é… Como eu faço para atribuir os valores dentro dos atribuitos tfNome e tfSenha a duas outras variáveis encapsudas para que eu possa usar os métodos getNome e getSenha da classe senha e através da instancia da classe Senha na classe ValidaSenha, eu venha a “resgatar” esses valores através dos métodos getNome e getSenha e comparar com os dados do arquivo.txt?

Hum, acho que essa pergunta fez complicar a compreensão de vocês a respeito da minha dúvida…=\

Mas, copiei o erro e colei logo abaixo.

Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
at Validar.ValidaSenha.Validar(ValidaSenha.java:19)
at Login.Senha$1.actionPerformed(Senha.java:70)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

É… Estou apontando para um objeto que não existe!

[code]package Login;

import javax.swing.;
import java.awt.
;
import java.awt.event.*;
import Validar.ValidaSenha;

public class Senha extends JFrame {

private JLabel lbNome, lbSenha;
private JTextField tfNome, tfResultado;
private JPasswordField tfSenha;
private JButton botao;
private JPanel painel, painel2;
private JMenuBar menuBar;
private JMenu menu;
private JMenuItem sair;

private String nome, senha;

ValidaSenha validaSenha = new ValidaSenha();

public Senha() {
	lbNome = new JLabel("Nome:");
	tfNome = new JTextField(10);
	lbSenha = new JLabel("Senha:");
	tfSenha = new JPasswordField(10);
	botao = new JButton("Enviar");
	tfResultado = new JTextField(10);
	painel = new JPanel(new GridLayout(2, 0));
	painel2 = new JPanel();
	menuBar = new JMenuBar();
	menu = new JMenu("Menu");
	sair = new JMenuItem("Sair");

	this.setTitle("Login");
	tfResultado.setEditable(false);

	menu.add(sair);
	menuBar.add(menu);
	this.setJMenuBar(menuBar);
	painel.add(lbNome);
	painel.add(tfNome);
	painel.add(lbSenha);
	painel.add(tfSenha);
	painel2.add(botao);
	this.add(painel, "North");
	this.add(painel2, "Center");
	this.setVisible(true);
	this.pack();
	this.setResizable(false);
	this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	
	painel.setBackground(Color.LIGHT_GRAY);
	painel2.setBackground(Color.LIGHT_GRAY);
	tfNome.setBackground(Color.WHITE);
	tfSenha.setBackground(Color.WHITE);

	//this.nome = tfNome.getText();
	//this.senha = tfSenha.getText();
	
	botao.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			nome = tfNome.getText();
			senha = tfSenha.getText();				
			if (validaSenha.Validar() == true)
				new TelaPrincipal().show();
			else {
				JOptionPane.showMessageDialog(null,
						"Login ou senha incorreto");
				tfNome.setText(null);
				tfSenha.setText(null);
			}
		}
	});
	sair.addActionListener(new ActionListener() {
		public void actionPerformed(ActionEvent e) {
			System.exit(0);
		}
	});
}

public String getNome() {
	return this.nome;
}

public String getSenha() {
	return this.senha;
}

}[/code]

[code]package Validar;

import java.io.*;
import Login.Senha;

public class ValidaSenha {

public boolean Validar() {
	try {

		InputStream arq = new FileInputStream(
				"C:/Documents and Settings/E003810/arquivo.txt");
		InputStreamReader isr = new InputStreamReader(arq);
		BufferedReader br = new BufferedReader(isr);
		String s = br.readLine();

		Senha senha = new Senha();

		if (senha.getNome().equals(s.substring(0, 4))
				&& senha.getSenha().equals(s.substring(4, 10))) {
			return true;
		}
		br.close();

	} catch (IOException e) {

		System.out.println("Erro" + e);

	}

	return false;
}

}[/code]

Agora a respeito de…

[quote]Se você usa o NetBeans pode desenhar toda a parte gráfica que ele gera o código e no lugar certo, vai ficar bem mais facil de você vizualizar e compreender o código, ainda mais quando se começa a programar
juliocesarss
[/quote]

Bom juliocesarss, discordo de você nessa parte, acho que o NetBeans não é muito bom para iniciantes, afinal, desenhar a interface gráfica com ele, visa mais produtividade a aprendizado.

[quote]E tente separar a crição dos campos do resto do código.
juliocesarss
[/quote]

Hum, isso eu não entendi… Não está separado?

Ah! Valeu mesmo pelo alerta do post, assim fica realmente muito mais fácil de ler o código! =]

[quote]separa a classe Senha apenas seus atributos: nome e senha
douglaskd
[/quote]

douglaskd, você fala criar uma classe para login separado da interface gráfica?

[quote]a classe senha não deve conter toda a parte gráfica

você pode até usar um construtor mais ele não criaria os campos, e sim usaria getText nos campos “ja criados e preenchidos” da tela.
douglaskd
[/quote]

Hum, desculpa, mas não consegui entender essas duas observações.

Obrigado pela atenção pessoal, aguardo resposta. :smiley:

Isso vai de cada um … eu disse isso pois pra mim foi muito mais facil de se entender, foi só uma dica de experiência própria ; :lol:

Em relaçao a atribuir valores nos campos tfNome e tfSenha.

Pelo que eu entendi, é isso que você quer:


tfNome.setText("Julio");

tfSenha.setText("1234");

//get vc pega o valor

//set vc insere o valor

Espero ter ajudado.

primeiro vc cria os métodos

public void setSenha(String senha){ this.senha = senha; }
e

public void setNome(String nome){ this.nome = nome; }isso ai fica na classe senha…

ja e o método valida senha recebe um objeto do tipo senha como prarâmetro ficando assim

[code]public boolean validar(Senha senha){

try {

        InputStream arq = new FileInputStream(   
                "C:/Documents and Settings/E003810/arquivo.txt");   
        InputStreamReader isr = new InputStreamReader(arq);   
        BufferedReader br = new BufferedReader(isr);   
        String s = br.readLine();    

        Senha senha = new Senha();   //tira isso daqui, daqui pra baixo ele irá usar o objeto passado como parâmetro.

        if (senha.getNome().equals(s.substring(0, 4))   
                && senha.getSenha().equals(s.substring(4, 10))) {   
            return true;   
        }   
        br.close();   

    } catch (IOException e) {   

        System.out.println("Erro" + e);   

    }   

    return false;   
}   [/code]

}

agora…

dentro do evento do botao vc coloca

[code]Senha senha = new Senha;
senha.setSenha = tfSenha.getText();
senha.setNome = tfnome.getText();

ValidaSenha vs = new ValidaSenha();

if(vs.validar(senha)){

//deu true, coloca a implementação
}
else{

// deu false, mostra o erro

}[/code]

não testei nada do que fiz, mais em teoria é isso, qualquer dúvida estamos ai…

Ah! Valeu galera, deu certo aqui!
Realmente o problema era quando eu tentava atribuir um valor ao atributo dentro do evento.

bom, resumindo, ficou assim…

[code]botao.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {

			Senha senha = new Senha();
			senha.nome = tfNome.getText();
			senha.senha = tfSenha.getText();

			if (validaSenha.Validar())
				new TelaPrincipal().show();
			else {
				JOptionPane.showMessageDialog(null,
						"Login ou senha incorreto");
				tfNome.setText(null);
				tfSenha.setText(null);
			}
		}
	});[/code]

Do jeito que o douglaskd mostrou, porém não usei o set, afinal, como estava dentro da classe não precisei usá-lo.
Hum, só uma pequena observação…

No caso de usar o “set”, tem um pequeno erro…Ficaria na verdade assim…

senha.setNome(tfNome.getText());

(É que fui tentar e deu erro, mas você mesmo disse que não havia testado).=]

Então é isso galera, valeu mesmo pelo força!

Um forte abraço douglaskd e juliocesarss. :smiley:

aihsaiha…errei mesmo…agora que vi…

mais é complicado eu fiz direto no forum editei umas 3x^^, tenho minhas desculpas rss

qualquer dúvida estamos ai

^^

Só Edtia o post.

Coloca [Resolvido].

Flws