Criando uma calculadora usando Java Swing e JGoodies

Este artigo é dedicado a você 🙂 que está começando a trabalhar com Interface Gráfica em Java e teve uma certa dificuldade em colocar todos os componentes de seu projeto em um layout organizado, para isso vos apresento o JGoodies, que facilitará [ e muito ] a vida na hora de dispor todos os componentes no layout. Para mostrar está ferramenta [JGoodies] vou montar uma calculadora simples, como mostrado na figura abaixo:

Para começar, vou fazer uma pequena introdução sobre Gerenciamento de Layout. “Quando um container tem mais de um  componente, é preciso especificar como esses componentes devem ser dispostos na apresentação. Em Java,  um objeto que implemente a interface LayoutManager é responsável por esse gerenciamento de disposição.  A interface LayoutManager2 é uma extensão de LayoutManager que incorpora o conceito de restrições de  posicionamento de componentes em um container. O pacote java.awt apresenta vários gerenciadores de layout  pré-definidos. As classes FlowLayout e GridLayout são implementações de LayoutManager; BorderLayout, CardLayout e GridBagLayout são implementações de LayoutManager2. Swing acrescenta ainda um gerenciador  BoxLayout". [Ricarte]

De inío temos que ter em “mãos” as bibliotemas JGoddies Common e JGoodies Forms, para isso basta acessar este Link e fazer o download das respectivas bibliotecas. Feito isso, crie um novo projeto java [File → New → Java Project], logo em seguida crie um novo folder com o nome de lib [clique no projeto → botão direito → New->Folder], agora descompacte as bibliotecas e copie os respectivos jars: jgoodies-common-1.2.1.jar e jgoodies-forms-1.4.2.jar no folder lib de seu projeto, estas são as versões que utilizei para realizar o projeto.

Vamos a melhor parte: programar, mas antes uma pausa para um café … Pronto, vamos continuar:

Clique com o botão direito do mouse sobre o Source Folder src e crie um novo pacote e logo em seguida clique sobre este novo pacote crie uma Classe, no meu caso Calculadora e logo em seguida faça os seguintes imports.

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class Calculadora extends JFrame implements ActionListener {

	private static final long serialVersionUID = 1L;
	double numeroA, numeroB, resultadoFinal = 0;
	int acao = 0;

	JButton soma;
	JButton subt;
	JButton divi;
	JButton mult;
	JButton expo;
	JButton deci;
	JButton raiz;
	JButton limpar;
	JButton igual;
	JButton um, dois, tres, quatro, cinco, seis, sete, oito, nove, zero;
	JTextArea textArea;
	JLabel calculadora;

	public Calculadora() {

		soma = new JButton("+");
		soma.setMnemonic(KeyEvent.VK_A);
		soma.setActionCommand("soma");
		soma.addActionListener(this);
		soma.setToolTipText("Soma");

		subt = new JButton("-");
		subt.setMnemonic(KeyEvent.VK_A);
		subt.setActionCommand("sub");
		subt.addActionListener(this);
		subt.setToolTipText("Sub");

		divi = new JButton("/");
		divi.setMnemonic(KeyEvent.VK_A);
		divi.setActionCommand("div");
		divi.addActionListener(this);
		divi.setToolTipText("Divis„o");

		mult = new JButton("x");
		mult.setMnemonic(KeyEvent.VK_A);
		mult.setActionCommand("mult");
		mult.addActionListener(this);
		mult.setToolTipText("MultiplicaÁ„o");

		expo = new JButton("ˆ");
		expo.setMnemonic(KeyEvent.VK_A);
		expo.setActionCommand("expo");
		expo.addActionListener(this);
		expo.setToolTipText("Expoente");

		raiz = new JButton("√");
		raiz.setMnemonic(KeyEvent.VK_A);
		raiz.setActionCommand("raiz");
		raiz.addActionListener(this);
		raiz.setToolTipText("Raiz Quadrada");

		limpar = new JButton("C");
		limpar.setMnemonic(KeyEvent.VK_A);
		limpar.setActionCommand("limpar");
		limpar.addActionListener(this);
		limpar.setToolTipText("Limpar");

		igual = new JButton("=");
		igual.setMnemonic(KeyEvent.VK_A);
		igual.setActionCommand("igual");
		igual.addActionListener(this);
		igual.setToolTipText("igual");

		um = new JButton("1");
		um.setMnemonic(KeyEvent.VK_A);
		um.setActionCommand("um");
		um.addActionListener(this);
		um.setToolTipText("um");

		dois = new JButton("2");
		dois.setMnemonic(KeyEvent.VK_A);
		dois.setActionCommand("dois");
		dois.addActionListener(this);
		dois.setToolTipText("dois");

		tres = new JButton("3");
		tres.setMnemonic(KeyEvent.VK_A);
		tres.setActionCommand("tres");
		tres.addActionListener(this);
		tres.setToolTipText("tres");

		quatro = new JButton("4");
		quatro.setMnemonic(KeyEvent.VK_A);
		quatro.setActionCommand("quatro");
		quatro.addActionListener(this);
		quatro.setToolTipText("quatro");

		cinco = new JButton("5");
		cinco.setMnemonic(KeyEvent.VK_A);
		cinco.setActionCommand("cinco");
		cinco.addActionListener(this);
		cinco.setToolTipText("cinco");

		seis = new JButton("6");
		seis.setMnemonic(KeyEvent.VK_A);
		seis.setActionCommand("seis");
		seis.addActionListener(this);
		seis.setToolTipText("seis");

		sete = new JButton("7");
		sete.setMnemonic(KeyEvent.VK_A);
		sete.setActionCommand("sete");
		sete.addActionListener(this);
		sete.setToolTipText("sete");

		oito = new JButton("8");
		oito.setMnemonic(KeyEvent.VK_A);
		oito.setActionCommand("oito");
		oito.addActionListener(this);
		oito.setToolTipText("oito");

		nove = new JButton("9");
		nove.setMnemonic(KeyEvent.VK_A);
		nove.setActionCommand("nove");
		nove.addActionListener(this);
		nove.setToolTipText("nove");

		zero = new JButton("0");
		zero.setMnemonic(KeyEvent.VK_A);
		zero.setActionCommand("zero");
		zero.addActionListener(this);
		zero.setToolTipText("zero");

		calculadora = new JLabel("JediCalc", JLabel.CENTER);

		textArea = new JTextArea(1, 5);
		JScrollPane result = new JScrollPane(textArea);

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationRelativeTo(null);

Agora vamos usar o JGoodies para arrumar o layout, a principio pode ficar meio confuso o mode de representar as colunas e linhas usando a biblioteca aconselho desenhar sua tela no papel e já separar as colunas e linhas. Importante: Os parametros passados serão sempre na ordem COLUNA, LINHA.

FormLayout vem do JGoodies e passa como parâmetro o número de colunas e linhas, nesta ordem. O dlu é uma unidade de medida usado no JGoodies, o 3 que o antecede representa o tamanho. Quando usamos o pref signfica que estamos definindo o melhor tamnho para este componente, no nosso caso temos 9 colunas e 15 linas, e o 3dlu representa os espaçamentos. xy representam as respectivas colunas e linhas e o w representa o comprimento.

Container conteiner = getContentPane();
		FormLayout layout = new FormLayout(
				"3dlu,pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu",
				"3dlu,pref,3dlu,20dlu,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu,pref,3dlu");
		JPanel painel = new JPanel(layout);

		CellConstraints cc = new CellConstraints();

		painel.add(calculadora, cc.xyw(2, 2, 7));
		painel.add(result, cc.xyw(2, 4, 7));
		painel.add(limpar, cc.xy(2, 6));
		painel.add(raiz, cc.xy(4, 6));
		painel.add(mult, cc.xy(6, 6));
		painel.add(divi, cc.xy(8, 6));
		painel.add(divi, cc.xy(8, 6));
		painel.add(sete, cc.xy(2, 8));
		painel.add(oito, cc.xy(4, 8));
		painel.add(nove, cc.xy(6, 8));
		painel.add(subt, cc.xy(8, 8));
		painel.add(quatro, cc.xy(2, 10));
		painel.add(cinco, cc.xy(4, 10));
		painel.add(seis, cc.xy(6, 10));
		painel.add(soma, cc.xy(8, 10));
		painel.add(um, cc.xy(2, 12));
		painel.add(dois, cc.xy(4, 12));
		painel.add(tres, cc.xy(6, 12));
		painel.add(expo, cc.xy(8, 12));
		painel.add(zero, cc.xy(6, 14));
		painel.add(igual, cc.xy(8, 14));
		conteiner.add(painel);
		pack();

	}

Está ficando um pouco grande, mas vamos terminar em breve esse artigo. Agora podemos finalmente fazer as ações dos botões e fazer nossa main();

@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == um)
			textArea.append("1");
		if (e.getSource() == dois)
			textArea.append("2");
		if (e.getSource() == tres)
			textArea.append("3");
		if (e.getSource() == quatro)
			textArea.append("4");
		if (e.getSource() == cinco)
			textArea.append("5");
		if (e.getSource() == seis)
			textArea.append("6");
		if (e.getSource() == sete)
			textArea.append("7");
		if (e.getSource() == oito)
			textArea.append("8");
		if (e.getSource() == nove)
			textArea.append("9");
		if (e.getSource() == zero)
			textArea.append("0");

		if (e.getSource() == limpar) {
			textArea.setText(null);
		}

		if (e.getSource() == soma) {
			numeroA = Double.parseDouble(textArea.getText());
			textArea.setText("");
			acao = 1;
		}

		if (e.getSource() == subt) {
			numeroA = Double.parseDouble(textArea.getText());
			textArea.setText(null);
			acao = 2;
		}

		if (e.getSource() == divi) {
			numeroA = Double.parseDouble(textArea.getText());
			textArea.setText(null);
			acao = 3;
		}

		if (e.getSource() == mult) {
			numeroA = Double.parseDouble(textArea.getText());
			textArea.setText(null);
			acao = 4;
		}

		if (e.getSource() == raiz) {
			textArea.setText(null);
			acao = 5;
		}

		if (e.getSource() == expo) {
			numeroA = Double.parseDouble(textArea.getText());
			textArea.setText(null);
			acao = 6;
		}

		if (e.getSource() == igual) {
			numeroB = Double.parseDouble(textArea.getText());
			switch (acao) {
			case 1:
				resultadoFinal = numeroA + numeroB;
				break;

			case 2:
				resultadoFinal = numeroA - numeroB;
				break;

			case 3:
				resultadoFinal = numeroA / numeroB;
				break;

			case 4:
				resultadoFinal = numeroA * numeroB;
				break;

			case 5:
				resultadoFinal = Math.sqrt(numeroB);
				break;

			case 6:
				resultadoFinal = Math.pow(numeroA, numeroB);
				break;
			}

			textArea.setText(null);
			textArea.append(String.valueOf(resultadoFinal));
		}
	}

	@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		Calculadora c = new Calculadora();
		c.show();
	}

}

Bom é isso, qualquer dúvida ou sugestão é so postar um comentário.
Que a força esteja com vocês!

Fontes:
Ricarte, Ivan Luiz Marques [http://www.dca.fee.unicamp.br/cursos/PooJava/graphic/layout.html]

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s