Italo Info


Calculadora em Java

Obs: Para aprender a construir a calculadora produzida para esse tutorial, é necessário conhecimento base para construção de aplicações em Java e orientação a objetos. Se não tem esse conhecimento, pode acompanhar o exemplo pela curiosidade de compreender como são feitos aplicativos em Java.

Esse tutorial foi produzido com o objetivo de mostrar como desenvolver uma simples calculadora utilizando a linguagem de programação Java. Vamos ver abaixo uma imagem capturada do programa produzido funcionando:

Imagem capturada do programa calculadora em execução

O código fonte de um programa é o código escrito seguindo as regras da gramática de uma linguagem de programação. Abaixo o exemplo da calculadora produzida em Java:

package calc; import java.awt.*; import java.awt.event.*; import java.text.*; import javax.swing.*; import javax.swing.border.*; class Calc extends JFrame implements ActionListener { private final static String MAIS = "+"; private final static String MENOS = "-"; private final static String MULT = "*"; private final static String DIV = "/"; private JTextField num1TF; private JTextField num2TF; private JComboBox operCBB; private JButton calcBT; private JTextField resultadoTF; private DecimalFormat df = new DecimalFormat( "0.00" ); public Calc() { num1TF = new JTextField( 5 ); num2TF = new JTextField( 5 ); operCBB = new JComboBox(); operCBB.addItem( MAIS ); operCBB.addItem( MENOS ); operCBB.addItem( MULT ); operCBB.addItem( DIV ); calcBT = new JButton( "Calcular" ); resultadoTF = new JTextField(); resultadoTF.setEditable( false ); JPanel calcPNL = new JPanel(); calcPNL.setLayout( new FlowLayout( FlowLayout.LEFT ) ); calcPNL.add( num1TF ); calcPNL.add( operCBB ); calcPNL.add( num2TF ); calcPNL.add( calcBT ); JPanel conteudoPNL = new JPanel(); conteudoPNL.setBorder( new TitledBorder( "Calculadora aritmética" ) ); conteudoPNL.setLayout( new BorderLayout() ); conteudoPNL.add( BorderLayout.CENTER, resultadoTF ); conteudoPNL.add( BorderLayout.SOUTH, calcPNL ); super.setTitle( "Calculadora" ); super.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); super.setContentPane( conteudoPNL ); super.pack(); super.setLocationRelativeTo( this ); calcBT.addActionListener( this ); } public void actionPerformed( ActionEvent e ) { boolean num1Ok = true; boolean num2Ok = true; double num1 = 0; try { num1 = df.parse( num1TF.getText() ).doubleValue(); } catch ( ParseException ex ) { num1Ok = false; } double num2 = 0; try { num2 = df.parse( num2TF.getText() ).doubleValue(); } catch ( ParseException ex ) { num2Ok = false; } if ( num1Ok && num2Ok ) { boolean divZero = false; double result = 0; Object selItem = operCBB.getSelectedItem(); if ( selItem.equals( MAIS ) ) { result = num1 + num2; } else if ( selItem.equals( MENOS ) ) { result = num1 - num2; } else if ( selItem.equals( MULT ) ) { result = num1 * num2; } else if ( selItem.equals( DIV ) ) { if ( num2 == 0 ) { divZero = true; } else { result = num1 / num2; } } if ( divZero ) { String msg = "Operação inválida - divisão por zero!"; JOptionPane.showMessageDialog( null, msg, "Calculadora", JOptionPane.WARNING_MESSAGE ); } else { resultadoTF.setText( df.format( result ) ); } } else { if ( num1Ok == false ) { String msg = "O valor \"" + num1TF.getText() + "\" não é um numero válido."; JOptionPane.showMessageDialog( this, msg, "Calculadora", JOptionPane.WARNING_MESSAGE ); } else if ( num2Ok == false ) { String msg = "O valor \"" + num2TF.getText() + "\" não é um numero válido."; JOptionPane.showMessageDialog( this, msg, "Calculadora", JOptionPane.WARNING_MESSAGE ); } } } public static void main( String[] args ) { Calc calc = new Calc(); calc.setVisible( true ); } }

Um pouco de orientação a objetos

A orientação a objetos é um paradigma de criação um pouco recente que permite associar atributos, métodos, construtores e classes filhas a uma classe. Revolucionou o modo de programar ampliando as possibilidades. Veja abaixo alguns conceitos de orientação a objetos:

  • Classe: uma classe é uma definição que permite agrupar métodos e atributos a uma classe, para que a mesma seja instanciada para um objeto que possa ser utilizado pelo programa.

  • Método: uma definição de um subprograma identificado por nome, tipo de retorno e parâmetros, onde os parâmetros podem ser objetos instancias de classes ou tipos primitivos.

  • Atributo: são variáveis definidas em uma classe.

Tanto classes, métodos e atributos são associados a modificadores de acesso. Em Java, os modificadores de acesso são: public, private, protected, default. Onde default é quando o modificador de acesso é omitido.

  • Herança: Em java, quando uma classe utiliza a palavra reservada extends, isso indica que ela deve herdar os atributos e métodos públicos e protegidos da classe estendida. A herança é útil para reuso de código e para tornar possível o polimorfismo, isto é, várias classes podem herdar atributos e métodos de uma mesma classe.

  • Interface: São como classes que permitem a definição, apenas, de um protótipo de um método que deve ser implementado por classes implementadoras da interface. O uso das interfaces é análogo a herança, porém, ao invés da palavra reservada extends, é utilizada a palavra reservada implements. As interfaces são úteis para utilização de polimorfismo.

  • Polimorfismo: Estratégia que permite que objetos de classes diferentes possam ser passados como parâmetro para um método, desde que os objetos tenham em comum a herança de uma classe ou implementação dos métodos de uma interface.

  • Encapsulamento: permite que classes limitem o acesso a seus atributos através da criação de métodos “gets” e “sets” para acesso e modificação dos valores dos atributos. No exemplo de código fonte desse tutorial, não foi utilizado encapsulamento para simplificar o exemplo.

O programa “calculadora”

Para construção do programa calculadora foi utilizada a biblioteca SWING disponível na linguagem Java para a criação da interface gráfica com o usuário. A interface gráfica é a parte visível do programa funcionando. Em outras palavras é a parte visível com que o usuário do interage para utilizar o programa.

No código fonte acima é criada uma classe que herda os métodos e atributos públicos e protegidos de uma classe chamada JFrame do pacote Java.swing. Para herança é utilizado à palavra reservada extends logo com a criação da classe “Calc”. A palavra reservada implements é utilizada para indicar que a classe “Calc” implementa os métodos definidos em uma interface de nome ActionListener do pacote Java.awt.event.

Gerenciadores de layout

Os gerenciadores de layout servem para o alinhamento dos componentes de interface gráfica na janela ou painel em que os componentes forem adicionados. Como exemplos de componentes de interface gráfica os componentes JButton e JTextField que são adicionados a um container, no exemplo JanelaSimples o container é a classe JanelaSimples que estende o container JFrame.

No exemplo JanelaSimples foi utilizado como gerenciador de layout o FlowLayout que permitiu alinhar os componentes a esquerda da janela. O exemplo abaixo, escrito em "JanelaSimples", ilustra o uso do gerenciador de layout e a adição de componentes ao container:

Container c = super.getContentPane(); c.setLayout( new FlowLayout( FlowLayout.LEFT ) ); c.add( nomeL ); c.add( nomeTF ); c.add( okBT );

Adicionando funcionalidade ao botão "Calcular"

É através da implementação da interface ActionListener e seu método que é possível adicionar funcionalidade ao botão “Calcular”. O método da interface ActionListener é mostrado abaixo:

public void actionPerformed( ActionEvent e ) { ... }

É no método acima onde é definido o código a ser executado quando o botão “Calcular” for clicado.

Na classe “Calc” é definido um atributo de nome “calcBT” que é um objeto instanciado mais a frente no código fonte, recebendo o texto “Calcular” que será mostrado no botão com a visualização da interface gráfica do programa. A linha de código a seguir mostra o modo de adicionar funcionalidade ao botão “Calcular”:

calcBT.addActionListener( this );

No exemplo acima o método addActionListener da classe JButton recebe como parâmetro um objeto instanciado de uma classe que implemente a interface ActionListener, no exemplo desse tutorial a classe que implementa a interface ActionListener é a classe “Calc”. A palavra reservada this indica que o objeto a ser passado para o método addActionListener é uma instancia da própria classe onde o método foi chamado.

Finalizando...

É isso pessoal. Não me aprofundei muito nas explicações. O exemplo da calculadora foi explicado de modo superficial, pois seria necessário um curso de Java, SWING e Orientação a Objetos para o leitor aprender a base necessária para compreender todo o exemplo.

Pretendo escrever no futuro sobre desenvolvimento da lógica de programação. Para isso, a linguagem Pascal é ideal.

Downloads

Download do arquivo Calc.jar: clique aqui.

Download do código fonte: clique aqui.

Se você tiver em seu computador instalado o Java (JRE), pode executar o programa com dois cliques no arquivo Calc.jar após baixá-lo.

Até o próximo!