Ajuda

2 respostas
M

Amigos o programa abaixo esta dando erros. E eu não consigo resolver.
A ideia é a seguinte receber os dados através das JTextFields e apresentar os dados em uma outra JTextField e em uma JLabel.

Obrigado a todos!

//Exercício 6.14 Página 310 do Livro Java como Programar 4ºEdição

//Pacotes do núcleo do java

import java.awt.<em>;

import java.awt.event.</em>;

//pacotes de extensão do java
import javax.swing.*;

public class Exerc614 extends JFrame

{

private JTextField TF_Base, TF_Expoente, TF_Resultado;

private JLabel L_Base, L_Expoente, L_Resultado, L_Resposta;

private JButton B_Executar;
//Construtor configura a GUI
public Exerc614()
{
	super( "Exercício 6.14" );
	Container janela = getContentPane();
	janela.setLayout( new FlowLayout() );
	
	//Constrói label e campo de texto
	JLabel L_Base = new JLabel("Base");
	JTextField TF_Base = new JTextField(5);
	
	//Constrói label e campo de texto "expoente"
	JLabel L_Expoente = new JLabel("Expoente");
	JTextField TF_Expoente = new JTextField(5);
	
	//Constrói label e campo de texto do "Resultado"
	JLabel L_Resultado = new JLabel("Resultado");
	JTextField TF_Resultado = new JTextField(5);
	TF_Resultado.setEditable(false);
	
	//Constrói label para resposta
	JLabel L_Resposta = new JLabel("Resposta");
	
	
	//Contrói botão
	JButton B_Executar = new JButton("Executar");
	
	//Cria uma instância da classe para tratamento do botão
	TrataBotao TB = new TrataBotao();
	B_Executar.addActionListener(TB);
	
	//Adiciona os componentes
	janela.add(L_Base);
	janela.add(TF_Base);
	janela.add(L_Expoente);
	janela.add(TF_Expoente);
	janela.add(L_Resultado);
	janela.add(TF_Resultado);
	janela.add(L_Resposta);
	janela.add(B_Executar);
	
	//Configura o tamanho da janela
	setSize(300, 200);
	
	//Torna a janela visível
	setVisible(true);
	
}//Fim do Construtor

//Classe interna privativa para tratamento de eventos do Botão
private class TrataBotao implements ActionListener
{
	//Trata eventos do botão
	public void actionPerformed( ActionEvent e )
	{
		
		int base = Integer.parseInt( TF_Base.getText() );
		int expoente = Integer.parseInt( TF_Expoente.getText() );
		
		double res = 0;
		
		for ( int i = 0; i &lt; expoente; i ++ )
			res *= base;
		
		String msg = String.format ( "O resultado é: %.2f", res );
		
		JOptionPane.showMessageDialog( null, msg, "Resultado", JOptionPane.INFORMATION_MESSAGE );
		
		TF_Resultado.setText(Double.toString(res));
		L_Resposta.setText(Double.toString(res));
		
		
	}//Fim do método trata botão
	
}//Fim da classe interna

}//Fim da classe Exerc614

2 Respostas

L

Teu erro esta no construtor, vc adiciona na tela objetos locais, criados no construtor, mas na sua inner class acessa atributos da classe, que não são inicializados, ou seja, estão todos nulos.

Troque o seu construtor por isso, é igual mas ao invés de usar variaveis locais, eu utilizo os atributos da classe:

super("Exercício 6.14");
		Container janela = getContentPane();
		janela.setLayout(new FlowLayout());

		// Constrói label e campo de texto
		L_Base = new JLabel("Base");
		TF_Base = new JTextField(5);

		// Constrói label e campo de texto "expoente"
		L_Expoente = new JLabel("Expoente");
		TF_Expoente = new JTextField(5);

		// Constrói label e campo de texto do "Resultado"
		L_Resultado = new JLabel("Resultado");
		TF_Resultado = new JTextField(5);
		TF_Resultado.setEditable(false);

		// Constrói label para resposta
		L_Resposta = new JLabel("Resposta");

		// Contrói botão
		B_Executar = new JButton("Executar");

		// Cria uma instância da classe para tratamento do botão
		TrataBotao TB = new TrataBotao();
		B_Executar.addActionListener(TB);

		// Adiciona os componentes
		janela.add(L_Base);
		janela.add(TF_Base);
		janela.add(L_Expoente);
		janela.add(TF_Expoente);
		janela.add(L_Resultado);
		janela.add(TF_Resultado);
		janela.add(L_Resposta);
		janela.add(B_Executar);

		// Configura o tamanho da janela
		setSize(300, 200);

		// Torna a janela visível
		setVisible(true);

A diferença está apenas na declaração, como suas variaveis locais tinha o mesmo nome dos atributos, foi só tirar o tipo que ele ja pega os atributos da classe.

Também tem outro errinho no seu calculo:

double res = 0;

			for (int i = 0; i < expoente; i++)
				res *= base;

res iniciou em 0, então 0*qualquer coisa é sempre 0 hehehe inicia res em 1. Ou então usa a função de Math chamada “pow”:

res = Math.pow(base, expoente);

:wink:

M

Valeu LuBS!!!
Muito obrigado.

Criado 11 de junho de 2007
Ultima resposta 11 de jun. de 2007
Respostas 2
Participantes 2