Como implementar os metodos de classe herdada?

Galera,

Meu professor fez um exemplo de calculadora que usa RMI, composta por 4 classes:

[code]import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Calculadora extends Remote
{
public double somar (double a, double b) throws RemoteException;
public double subtrair (double a, double b) throws RemoteException;
public double multiplicar (double a, double b) throws RemoteException;
public double dividir (double a, double b) throws RemoteException;
}[/code]

[code]import java.rmi.server.UnicastRemoteObject;
import java.rmi.RemoteException;

public class CalculadoraImpl extends UnicastRemoteObject implements Calculadora {

public CalculadoraImpl () throws RemoteException 
{
super(); 
}

public double somar (double a, double b) throws RemoteException 
{
	return a+b; 
}
public double subtrair (double a, double b) throws RemoteException 
{
	return a-b;
}
public double multiplicar (double a, double b) throws RemoteException 
{
	return a*b; 
}
public double dividir (double a, double b) throws RemoteException 
{
	return a/b; 
}

}[/code]

[code]import java.rmi.Naming; // registra o servico no registry

public class ServidorCalculadora
{
public ServidorCalculadora ()
{
try
{
// instancia o objeto q implementa a interface. c eh a referencia
Calculadora c = new CalculadoraImpl();
// registra o serviço ServicoCalculadora no registry
Naming.rebind(“rmi://localhost:1099/ServicoCalculadora”,c);
}
catch (Exception e)
{
System.out.println("Erro: "+e);
}
}

public static void main (String args[])
{
	// instancia o objeto
	new ServidorCalculadora ();
	System.out.println("Servidor inicializado");
}

}[/code]

[code]import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;

public class ClienteCalculadora
{
public static void main(String[] args)
{
try
{
// faz uma referencia ao objeto q implementa o metodo
// metodo lookup faz uma pesquisa pelo metodo especificado. No caso, ServicoCalculadora
Calculadora c = (Calculadora) Naming.lookup(“rmi://localhost/ServicoCalculadora”);
System.out.println( c.somar(4, 3)); //chamada ao serviço remoto somar
System.out.println( c.multiplicar(5,5)); //chamada ao serviço remoto multiplicar
System.out.println( c.subtrair(5,2));
System.out.println( c.dividir(10,5));
}
catch (MalformedURLException murle) // endereco invalido
{
System.out.println(murle);
}
catch (RemoteException re) // problema de comunicacao
{
System.out.println(re);
}
catch (NotBoundException nbe) //
{
System.out.println(nbe);
}
catch (java.lang.ArithmeticException ae) // erros de calculo. Divisao por 0, por exemplo
{
System.out.println(ae);
}
}
}[/code]

O problema é que ele quer que eu faça uma classe TelaCalculadora, com a interface gráfica da calculadora… A tela seria simples, com 3 JTextField’s, sendo um para receber o valor A, um para receber o valor B e um para receber o resultado. Além disso, teria q ter os botoes das operacoes +, -, * e /…

Como sou iniciante em Java, não sei nem que classe herdar, ou implementar… Também não sei como os eventos dos botoes da classe TelaCalculadora chamarão os métodos das classes acima, como a classe TelaCalculadora vai receber o resultado da operacao e tal…

Tem como me ajudarem? Que classe eu tenho q herdar ou implementar na minha classe TelaCalculadora? Como eu faço para que os valores digitados nos JTextField’s da classe TelaCalculadora sejam passados para a classe que efetua as operacoes?

Help me!!

Grato e no aguardo

Oi,

Recomendo que você dê uma olhadinha em algum tutorial de Swing, como por exemplo este aqui.

A classe que você vai herdar é a JFrame e para obter os valores que serão passados para o objeto que efetua as operações (que você instancia igual no cliente passado pelo seu professor) você usa o getText() do JTextField.

Voce pode aprender duas APIs diferentes para GUIs

SWING ou AWT.
http://java.sun.com/docs/books/tutorial/uiswing/index.html

Uma outra maneira, é presenciar um curso oficial da Sun - SL275 ou um específico para SWING SL-320.

[]'s

Galera, tentei mas está dando uma porrada se erros…

Aí vai o código da classe que eu fiz:

[code]import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import javax.swing.;
import java.awt.
;
import java.awt.event.*;

public class TelaCalculadora extends JFrame
{
public JTextField textValorA, textValorB, textResultado;
public JLabel labelA, labelB, labelResultado;
public JPanel topo, centro, rodape;
public JButton soma, subtrai, multiplica, divide;
public String valorA, valorB;
public double result;

// configura a GUI
public TelaCalculadora()
{
	super( "Calculadora RMI" );
	
	// obtém o painel de conteúdo e o configura
	this.setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );
	this.setSize( 500, 600 );
	topo = new JPanel();
	centro = new JPanel();
	rodape = new JPanel();
	
	result = 0;
	
	// cria as bordas
	centro.setBorder( BorderFactory.createEtchedBorder() );
	
	// dimensiona os panels
	topo.setPreferredSize( new Dimension( 0, 300 ));
	rodape.setPreferredSize( new Dimension( 0, 100 ));
	
	// cria o container e adiciona os componentes
	Container panel = this.getContentPane();
	panel.add( topo, BorderLayout.NORTH );
	panel.add( rodape, BorderLayout.SOUTH );
	panel.add( centro, BorderLayout.CENTER );
	
	// configura o layout do topo, cria e adiciona os componentes
	topo.setLayout( new GridLayout( 2, 2 ) );
	labelA = new JLabel( "Digite o primeiro valor:", SwingConstants.RIGHT );
	textValorA = new JTextField( 10 );
	labelB = new JLabel( "Digite o segundo valor:", SwingConstants.RIGHT );
	textValorB = new JTextField( 10 );
	
	topo.add( labelA );
	topo.add( textValorA );
	topo.add( labelB );
	topo.add( textValorB );
	
	// configura o layout do centro, cria e adiciona os botoes
	centro.setLayout ( new FlowLayout() );
	soma = new JButton( "+" );
	subtrai = new JButton( "-" );
	multiplica = new JButton( "*" );
	divide = new JButton( "/" );
	
	centro.add( soma );
	centro.add( subtrai );
	centro.add( multiplica );
	centro.add( divide );
	
	// configura o layout do rodape, cria e adiciona os componentes
	//rodape.setlayout ( new FlowLayout() );
	labelResultado = new JLabel( "Resultado" );
	textResultado = new JTextField();
	
	rodape.add( labelResultado );
	rodape.add( textResultado );
	
	// conexao e operacao
	try 
	{
	// faz uma referencia ao objeto q implementa o metodo
	// metodo lookup faz uma pesquisa pelo metodo especificado. No caso, ServicoCalculadora
	Calculadora c = (Calculadora) Naming.lookup("rmi://localhost/ServicoCalculadora");
			
	a = Double.parseDouble( textValorA.getText() );
	b = Double.parseDouble( textValorB.getText() );
	
	// eventos dos botoes
	soma.addActionListener( new ActionListener()
	{
		public void actionPerformed(ActionEvent ev)
		{
			result = c.somar( a, b );
			textResultado.setText(result);
		}
	}
	);
	
	subtrai.addActionListener( new ActionListener()
	{
		public void actionPerformed(ActionEvent ev)
		{
			result = c.subtrair( a, b );
			textResultado.setText(result);
		}
	}
	);
	
	multiplica.addActionListener( new ActionListener()
	{
		public void actionPerformed(ActionEvent ev)
		{
			result = c.multiplicar( a, b );
			textResultado.setText(result);
		}
	}
	);
	
	divide.addActionListener( new ActionListener()
	{
		public void actionPerformed(ActionEvent ev)
		{
			result = c.dividir( a, b );
			textResultado.setText(result);
		}
	}
	);
	
	} 
	catch (MalformedURLException murle) // endereco invalido
	{
		System.out.println(murle); 
	}
	catch (RemoteException re) // problema de comunicacao
	{
		System.out.println(re); 
	}
	catch (NotBoundException nbe) //
	{
		System.out.println(nbe);
	}
	catch (java.lang.ArithmeticException ae) // erros de calculo. Divisao por 0, por exemplo
	{	
		System.out.println(ae); 
	}		
}

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

}[/code]

Os erros estão todos dentro do bloco try…

Os erros são esses:

D:Documents and SettingsMeus documentos miCalculadoraTelaCalculadora.java:122: cannot resolve symbol symbol: variable a result = c.dividir( a, b ); ^ D:Documents and SettingsMeus documentos miCalculadoraTelaCalculadora.java:122: cannot resolve symbol symbol: variable b result = c.dividir( a, b ); ^ D:Documents and SettingsMeus documentos miCalculadoraTelaCalculadora.java:122: local variable c is accessed from within inner class; needs to be declared final result = c.dividir( a, b ); ^ D:Documents and SettingsMeus documentos miCalculadoraTelaCalculadora.java:123: setText(java.lang.String) in javax.swing.text.JTextComponent cannot be applied to (double) textResultado.setText(result);

Aí estão os erros do método de divisão… os erros se repetem nas outras 3 operacoes (+, -, *)… são 18 erros no total…

O que está errado? Tentei fazer a implementacao igual a da classe ClienteCalculadora, q foi passada pelo professor e que compila e funciona corretamente…

Grato e no aguardo,

O problema aqui é que a, b e c não estão visíveis às inner classes anônimas que vc está declarando nos .addActionListener()s. Conserte o escopo dessas variáveis (ou declare-as dentro do ActionListener que funciona :wink:

Complementando…

No caso de a e b elas nem foram declaradas, você fez a atribuição em algo que não existe. Declare elas no início da classe ou faça

double a = Double.parseDouble( textValorA.getText() ); double b = Double.parseDouble( textValorB.getText() );

E quando ao último erro, faça

textResultado.setText(Double.toString(result));

Então, eu não declarei as variáveis a, b e c pq elas são da classe Calculadora (o código esta no topo da página).

Calculadora c = (Calculadora) Naming.lookup("rmi://localhost/ServicoCalculadora");

O que eu gostaria de fazer é uma classe igual a ClienteCalculadora (também no topo da página), só que com a interface gráfica. A classe ClienteCalculadora compila e executa corretamente e as variaveis não estão declaradas nela… a TelaCalculadora não… Como usar as variaveis declaradas na classe Calculadora?

Por favor, analisem as classes postadas que estão no topo da página pois elas fazem parte do projeto…

Não sei o que estou fazendo de errado…

Grato e no aguardo

As coisas não funcionam assim…
Se você quer usar uma variável, ela tem que estar declarada na própria classe ou estar referenciada pelo objeto, por exemplo c.a seria a variável a do objeto calculadora c. Mas mesmo assim essas variáveis nem estão declaradas na calculadora também! Na calculadora você só tem a e b nas assinaturas dos métodos, mas aí esses a e b só valem dentro do método.
No seu exemplo de cliente as variáveis não foram declaradas porque ele está passando os valores literais diretamente (4, 3, etc) mas no seu caso você quer passar algo que vai variar, então você precisa declarar essa variável com qualquer nome e aí passar para o método da calculadora. Quando esse método da calculadora receber dois valores double ele vai automaticamente saber que o primeiro corresponde ao a e o segundo ao b.

[quote=“Bani”]As coisas não funcionam assim…
Se você quer usar uma variável, ela tem que estar declarada na própria classe ou estar referenciada pelo objeto, por exemplo c.a seria a variável a do objeto calculadora c. Mas mesmo assim essas variáveis nem estão declaradas na calculadora também! Na calculadora você só tem a e b nas assinaturas dos métodos, mas aí esses a e b só valem dentro do método.
No seu exemplo de cliente as variáveis não foram declaradas porque ele está passando os valores literais diretamente (4, 3, etc) mas no seu caso você quer passar algo que vai variar, então você precisa declarar essa variável com qualquer nome e aí passar para o método da calculadora. Quando esse método da calculadora receber dois valores double ele vai automaticamente saber que o primeiro corresponde ao a e o segundo ao b.[/quote]

Obrigadao pelo toque, mas eu ainda estou meio perdido… :roll: Como eu faço isso q vc me explicou?

Como eu passo para o método da calculadora? Tbm nao estou entendendo o pq do erro:

local variable a is accessed from within inner class; needs to be declared final

Esse erro se repete para todas as outras variaveis tbm…

Exatamente como foi explicado antes.
Esse erro de escopo foi explicado pelo cv.

O método que vai fazer a soma ficaria assim:

[code]
soma.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent ev)
{
Calculadora c = (Calculadora) Naming.lookup(“rmi://localhost/ServicoCalculadora”);

        double a = Double.parseDouble( textValorA.getText() );
        double b = Double.parseDouble( textValorB.getText() );
        result = c.somar( a, b );
        textResultado.setText(result);
     }
  }
  ); [/code]

Você deve também apagar as linhas

[code] Calculadora c = (Calculadora) Naming.lookup(“rmi://localhost/ServicoCalculadora”);

  a = Double.parseDouble( textValorA.getText() );
  b = Double.parseDouble( textValorB.getText() ); [/code] na parte de cima, pois eu coloquei já dentro da inner class.

E sinceramente eu acho que você deveria ler algum livro ou tutorial de Java, pois estar estudando RMI sem entender como funciona a parte básica do Java, como a declaração de variáveis, não faz o mínimo sentido, só vai atrapalhar para você entender os conceitos mais avançados.

Ou você pode fazer o primeiro curso da Sun recomendado pelo Oziel. Nesse caso acho bem válida a sugestão dele. :smiley:

Valew pela ajuda…

Qto as dicas dos cursos, eu estou começando a ver java agora na faculdade, mas vou me aprofundar sim…

Grato.