.getText[RESOLVIDO]

9 respostas
harlequinn

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.<em>;

import java.awt.</em>;

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…=]

9 Respostas

juliocesarss

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.

douglaskd

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.

juliocesarss

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

harlequinn

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!

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

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

}

Agora a respeito de...

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

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.

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

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! =]

separa a classe Senha apenas seus atributos: nome e senha douglaskd

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

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

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

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

juliocesarss

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.

douglaskd

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

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

}

agora....

dentro do evento do botao vc coloca

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

}

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

harlequinn

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...

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);
				}
			}
		});

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. :D

douglaskd

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

juliocesarss

^^

Só Edtia o post.

Coloca [Resolvido].

Flws

Criado 15 de outubro de 2010
Ultima resposta 19 de out. de 2010
Respostas 9
Participantes 3