Calculadora

Boa Tarde estou querendo criar uma calculadora alguém pode me ajudar como eu posso desenvolver a parte visual e pelo menos o começo depois eu me viro ja tentei criar no netbeans e não consegui.

Segue um código que consegui na internet, talvez possa lhe ajudar.

package br.com.jml.client.gui.util;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import javax.swing.border.LineBorder;

import br.com.jml.client.gui.mdi.genericos.FormPadrao;
import br.com.jml.geral.util.Funcoes;
import br.com.jml.server.dao.Sistema;

public class Calculadora extends FormPadrao implements KeyListener{
    private JButton botao1, botao2, botao3, botao4, botao5, botao6, botao7, botao8, 
            botao9, botao0, botaoC, botaoCE, botaoDiv, botaoMultip, botaoMenos, 
            botaoMais, botaoVirgula, botaoTotal, botaoPerc, botaoBackspace; 
    private JTextArea roloPapel;
    private JLabel visor, keyCodigo;
    private JScrollPane scroll;
    private double soma = 0;
    private String valor = "", operador = "", valorAnterior = "";

    private Container container;
    private GridBagLayout layout;
    private GridBagConstraints constraints;
    private JRadioButton botao2dig, botao4dig, botao6dig;
    private ButtonGroup botaoDecimais;
    private int casasDecimais = 2;
    
    // Classe de tratamento e eventos de A��o ==========================
    private class trataEventosAcao implements ActionListener {
        public void actionPerformed ( ActionEvent event){
                if (event.getSource() == botaoC) teclouC();
                else if ( event.getSource() == botaoCE) teclouCE();
                else if ( event.getSource() == botaoPerc) teclouP();
                else if ( event.getSource() == botaoVirgula) teclouVirgula();
                else if ( event.getSource() == botaoBackspace) teclouBackspace();
                else if ( event.getSource() == botao1) teclouNumeros("1");
                else if ( event.getSource() == botao2) teclouNumeros("2");
                else if ( event.getSource() == botao3) teclouNumeros("3");
                else if ( event.getSource() == botao4) teclouNumeros("4");
                else if ( event.getSource() == botao5) teclouNumeros("5");
                else if ( event.getSource() == botao6) teclouNumeros("6");
                else if ( event.getSource() == botao7) teclouNumeros("7");
                else if ( event.getSource() == botao8) teclouNumeros("8");
                else if ( event.getSource() == botao9) teclouNumeros("9");
                else if ( event.getSource() == botao0) teclouNumeros("0");
                else if ( event.getSource() == botaoMais)   teclouMais();
                else if ( event.getSource() == botaoMenos)  teclouMenos();
                else if ( event.getSource() == botaoDiv)    teclouDiv();
                else if ( event.getSource() == botaoMultip) teclouMultip();
                else if ( event.getSource() == botaoTotal)  teclouEnter();
        }    
    }

    // Classe de tratamento de eventos Focus (nenhum componente vai recebe o focu alem do visor,
    // mas deixo o codigo abaixo pra efeito didatico
    private class trataEventosFocus implements FocusListener {
        // == qdo os campos texto ganham focus
        public void focusGained(FocusEvent event)
        {//============= 
            }
        // == qdo os campos texto perdem o focus
        public void focusLost(FocusEvent event) 
        { //=============
            } 
      }

    // Classe de tratamento de eventos Focus (nenhum componente vai recebe o focu alem do visor,
    // mas deixo o codigo abaixo pra efeito didatico
    private class trataEventosRadio implements ItemListener {
        // == qdo os campos texto ganham focus
        public void itemStateChanged(ItemEvent event){
            if (event.getSource() == botao2dig ){
              //Mudou pra dois digitos decimais
               casasDecimais = 2; 
              }
            if (event.getSource() == botao4dig ){
              //Mudou pra quatro digitos decimais  
               casasDecimais = 4; 
              }
            if (event.getSource() == botao6dig ){
              //Mudou pra seis digitos decimais  
               casasDecimais = 6;
              }
            }
      }
    
    
// Tratamento de eventos de teclado   
  public void keyPressed(KeyEvent e){
        // VK_ESCAPE � uma constante est�tica. Tanto faz usar e ou KeyEvent
     if(e.getKeyCode() == e.VK_ESCAPE){ 
            // passando this e nao null, mensagem aparece centro da janela 
            int selectedOption = JOptionPane.showConfirmDialog(this,"Deseja Sair Realmente?", "Aten��o", JOptionPane.YES_NO_OPTION);
             if(selectedOption == JOptionPane.YES_OPTION){
                dispose();
                System.exit(0);
            }
           } 
     if (e.getKeyCode() == 67)teclouC();
     if (e.getKeyCode() == 69)teclouCE();
     if (e.getKeyCode() == 8) teclouBackspace();
     if (e.getKeyCode() == 110) teclouVirgula();
     if (((e.getKeyCode() >= e.VK_0 ) && (e.getKeyCode() <= e.VK_9 )) ||
         ((e.getKeyCode() >= e.VK_NUMPAD0 ) && (e.getKeyCode() <= e.VK_NUMPAD9 )))
         teclouNumeros(""+e.getKeyChar());
     if ((e.getKeyCode() == 61)||(e.getKeyCode() == 107)) teclouMais();
     if ((e.getKeyCode() == 45)||(e.getKeyCode() == 109)) teclouMenos();
     if ((e.getKeyCode() == 59)||(e.getKeyCode() == 111)) teclouDiv();
     if (e.getKeyCode() == 106) teclouMultip();
     if (e.getKeyCode() == 80) teclouP();
     if (e.getKeyCode() == 10) teclouEnter();
   }
   
   public void keyReleased(KeyEvent e)  {
       //visor.setText("Tecla liberada"); 
   }
   
   public void keyTyped(KeyEvent e) {
       //visor.setText(""+e.getKeyCode());  
   }

  // Funcoes logo abaixo sao usadas nos eventos de botoes e teclado
  // Teclou "C" limpa so valor digitado
  public void teclouC (){
      valor = "0";
      visor.setText(formatStrNumerica(valor,casasDecimais));
     }

  // Teclou "E" limpa tudo
  public void teclouCE (){
      valor = "0";
      soma = 0;
      visor.setText(formatStrNumerica(valor,casasDecimais));
      roloPapel.append(alinhaStringDir("-------------------------------"+"\n"));
      roloPapel.append(alinhaStringDir(" "+"\n"));
  }

  // Percentagem teclou "P" calcula o percentual
  public void teclouP (){
      roloPapel.append(alinhaStringDir(formatStrNumerica(valor,casasDecimais) +" %"+"\n"));
      roloPapel.append(alinhaStringDir("-------------------------------"+"\n"));
       if (operador == "*") soma = soma * (Double.parseDouble(valor)/100);
        else if (operador == "/") soma = soma / (Double.parseDouble(valor)/100);
      roloPapel.append(alinhaStringDir(formatStrNumerica(""+soma, casasDecimais) +" ="+"\n"));
      roloPapel.append(alinhaStringDir(" "+"\n"));
      visor.setText(formatStrNumerica(""+soma,casasDecimais));
      valorAnterior = ""+soma;
      soma = 0;
      valor="";      
  }

  // Teclou "," V�rgula decimal   
  public void teclouVirgula (){
       if (valor.lastIndexOf(".")== -1 )  valor = valor + ".";
       visor.setText(valor);
  }

  // Teclou Backspace remove ultimo carctere do valor
  public void teclouBackspace(){
       if (valor.length() == 1) valor = "0";          
         else valor = valor.substring(0, valor.length()-1); 
       visor.setText(valor);
  }  
  
  //Pega somente os Numeros digitados
  public void teclouNumeros(String s){
       if (valor.length() <= 14){
         if (valor == "0") valor = "";
       valor = valor+s;
       visor.setText(valor);
        }
  }
  
  // Adi��o teclou "+"
  public void teclouMais (){
       if (valor == "" )valor = valorAnterior; 
       roloPapel.append(alinhaStringDir(formatStrNumerica(valor,casasDecimais) +" +"+"\n"));
       soma = soma + Double.parseDouble(valor);
       visor.setText(formatStrNumerica(""+soma,casasDecimais));
       valorAnterior = valor;
       valor="";
       operador="+";
  }
  
// Subtra��o teclou "-"
  public void teclouMenos(){
       if (valor == "" )valor = valorAnterior;
       roloPapel.append(alinhaStringDir(formatStrNumerica(valor,casasDecimais) +" -"+"\n"));
       soma = soma - Double.parseDouble(valor);
       visor.setText(formatStrNumerica(""+soma,casasDecimais));
       valorAnterior = valor;
       valor="";
       operador="-";
  }

  // Divis�o teclou "/" ou ":"
  public void teclouDiv (){
       if (valor == "" )valor = valorAnterior; 
       roloPapel.append(alinhaStringDir("-------------------------------"+"\n"));
       roloPapel.append(alinhaStringDir(" "+"\n"));
       roloPapel.append(alinhaStringDir(formatStrNumerica(valor,casasDecimais) +" /"+"\n"));
       soma = Double.parseDouble(valor);
       visor.setText(formatStrNumerica(""+soma,casasDecimais));
       valor="";
       operador="/";
  }

// Multiplica��o teclou "*"
public void teclouMultip(){
       if (valor == "" )valor = valorAnterior;
       roloPapel.append(alinhaStringDir("-------------------------------"+"\n"));
       roloPapel.append(alinhaStringDir(" "+"\n"));
       roloPapel.append(alinhaStringDir(formatStrNumerica(valor,casasDecimais) +" *"+"\n"));
       soma = Double.parseDouble(valor);
       visor.setText(formatStrNumerica(""+soma,casasDecimais));
       valor="";
       operador="*";
} 

// Totaliza��o ENTER
public void teclouEnter(){
      if (( operador == "+")||(operador == "-")){
            roloPapel.append(alinhaStringDir("-------------------------------"+"\n"));
            roloPapel.append(alinhaStringDir(formatStrNumerica(""+soma,casasDecimais) +" T"+"\n"));
       }
       if (( operador == "/") && (soma != 0 )){
            roloPapel.append(alinhaStringDir(formatStrNumerica(valor,casasDecimais) +"  "+"\n"));
            roloPapel.append(alinhaStringDir("-------------------------------"+"\n"));
            soma = soma / Double.parseDouble(valor);
            roloPapel.append(alinhaStringDir(formatStrNumerica(""+soma,casasDecimais) +" ="+"\n"));
       }
       if ( operador == "*"){
            roloPapel.append(alinhaStringDir(formatStrNumerica(valor,casasDecimais) +"  "+"\n"));
            roloPapel.append(alinhaStringDir("-------------------------------"+"\n"));
            soma = soma * Double.parseDouble(valor);
            roloPapel.append(alinhaStringDir(formatStrNumerica(""+soma,casasDecimais) +" ="+"\n"));
       }
       roloPapel.append(alinhaStringDir(" "+"\n"));
       visor.setText(formatStrNumerica(""+soma,casasDecimais));
       valorAnterior = ""+soma;
       soma = 0;
       valor="";
   } 

   //Funcao para alinhar os string a direita usado no JTextArea
   public String alinhaStringDir(String s){
       String alinhador = "";
       int i;
       for ( i = 0; i < (36 - s.length()); i++){
       alinhador = alinhador+" ";    
       }
       return alinhador+s;
    }

   //Fun��o que formata string numerica (nao estou usando ainda falta incluir componente 
   //para optar qtde de digitos depois da virgula
   public String formatStrNumerica(String s, int dig){
       DecimalFormat decimal = new DecimalFormat();
       decimal.setMinimumFractionDigits(dig);
       DecimalFormatSymbols simbolos = new DecimalFormatSymbols();
       simbolos.setGroupingSeparator(',');
       simbolos.setDecimalSeparator('.');
       decimal.setDecimalFormatSymbols(simbolos);
       return decimal.format(new java.math.BigDecimal(s));       
   }
   
   
   // Fun��o que adiciona o componente no panel corretamente
    private void addComponent ( Component component, int row, int column, int width, int height){
            // addComponent(button1, LINHA, COLUNA, QTDECOLUNAS, QTDELINHAS)
            constraints.gridx = column;
            constraints.gridy = row;
            constraints.gridwidth = width;
            constraints.gridheight = height;
            layout.setConstraints(component, constraints);
            container.add (component);
        }
   
    /** Creates a new instance of Main */
    public Calculadora(Container owner,Sistema sistema) {
       super(owner);
       this.setTitle(Funcoes.getDescricao("titulo_calculadora"));
       // Inicializa as variaveis de gerenciamento de layout ========
       container = getContentPane();
       layout = new GridBagLayout();
       container.setLayout(layout);
       constraints = new GridBagConstraints();

       // inicializa as variaveis dos objetos (componentes)==========
       botao1 = new JButton("  1  ");
       botao2 = new JButton("  2  ");
       botao3 = new JButton("  3  ");
       botao4 = new JButton("  4  ");
       botao5 = new JButton("  5  ");
       botao6 = new JButton("  6  ");
       botao7 = new JButton("  7  ");
       botao8 = new JButton("  8  ");
       botao9 = new JButton("  9  ");
       botao0 = new JButton("  0  ");
       botaoC = new JButton("  C  ");
       botaoC.setToolTipText("Tecle C");
       botaoCE = new JButton("  CE ");
       botaoCE.setToolTipText("Tecle E");
       botaoDiv = new JButton("  /  ");
       botaoMultip = new JButton("  *  ");
       botaoMenos = new JButton("  -  ");
       botaoMais = new JButton("  +  ");
       botaoVirgula = new JButton("  ,  ");
       botaoVirgula.setToolTipText("Tecle , (Virgula)");
       botaoTotal = new JButton("  T  ");
       botaoTotal.setToolTipText("Tecle ENTER");
       botaoPerc = new JButton("  %  ");
       botaoPerc.setToolTipText("Tecle P");
       botaoBackspace = new JButton("  <  ");
       botaoBackspace.setToolTipText("Tecle Backspace");
       keyCodigo = new JLabel("0");
       visor = new JLabel("0.00");
       visor.setHorizontalAlignment(SwingConstants.RIGHT);
       visor.setFont(new Font("Courier New", Font.BOLD, 16));
       visor.setForeground(Color.RED);
       visor.setToolTipText("Valores at� 14 digitos");
       //Crio a parte de text area q ira receber os valores e crio as barras de
       // rolagem dom o scroll (que � um container) depois so adiciona o container scroll
       roloPapel = new JTextArea(12, 15);
       roloPapel.setEditable(false);
       roloPapel.setFont(new Font("Courier New",Font.PLAIN,11));
       scroll = new JScrollPane(roloPapel, ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,
                                ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
       scroll.setBorder(new LineBorder(Color.pink, 3, true));
       botao2dig = new JRadioButton("2", true);
       botao4dig = new JRadioButton("4",false);
       botao6dig = new JRadioButton("6  : Digitos Decimais",false);
       botaoDecimais = new ButtonGroup();
       botaoDecimais.add(botao2dig);
       botaoDecimais.add(botao4dig);
       botaoDecimais.add(botao6dig);
       // Deixo apenas o label visor com foco pra fazer tratamento eventos teclado so nele
       visor.setFocusable(true);
       botao1.setFocusable(false);
       botao2.setFocusable(false);
       botao3.setFocusable(false);
       botao4.setFocusable(false);
       botao5.setFocusable(false);
       botao6.setFocusable(false);
       botao7.setFocusable(false);
       botao8.setFocusable(false);
       botao9.setFocusable(false);
       botao0.setFocusable(false);
       botaoC.setFocusable(false);
       botaoCE.setFocusable(false);
       botaoMais.setFocusable(false);
       botaoMenos.setFocusable(false);
       botaoDiv.setFocusable(false);
       botaoPerc.setFocusable(false);
       botaoMultip.setFocusable(false);
       roloPapel.setFocusable(false);
       botaoVirgula.setFocusable(false);
       botaoTotal.setFocusable(false);
       botaoBackspace.setFocusable(false);
       botao2dig.setFocusable(false);
       botao4dig.setFocusable(false);
       botao6dig.setFocusable(false);
       //======anchor=WEST mantem alinhamento dos componetnes a esquerda das celulas 
       //======weightx=0 indica que nao deve aumentar na horizontal pra ocupar celula
       //======weighty=N indica que dever aumentar na vertical N pixel pra ocupar a celula 
       constraints.anchor = GridBagConstraints.WEST;
       constraints.weightx = 0;
       constraints.weighty = 1;
       // adiciona os componente usando a funcao
       // addComponent(button1, LINHA, COLUNA, QTDECOLUNAS, QTDELINHAS)
       constraints.fill = GridBagConstraints.BOTH;
       addComponent(scroll,        0, 0, 5, 1);
       addComponent(visor,         1, 0, 5, 1);
       addComponent(botao2dig,     2, 0, 1, 1);
       addComponent(botao4dig,     2, 1, 1, 1);
       addComponent(botao6dig,     2, 2, 3, 1);
       constraints.weightx = 0;
       constraints.weighty = 5;
       addComponent(botaoPerc ,    3, 0, 1, 1);
       addComponent(botaoCE,       3, 4, 1, 1);
       addComponent(botaoC,        4, 4, 1, 1);
       addComponent(botaoBackspace,5, 4, 1, 1);
       addComponent(botaoDiv,      3, 1, 1, 1);
       addComponent(botaoMultip,   3, 2, 1, 1);
       addComponent(botaoMenos,    3, 3, 1, 1);
       addComponent(botao7,        4, 0, 1, 1);
       addComponent(botao8,        4, 1, 1, 1);
       addComponent(botao9,        4, 2, 1, 1);
       addComponent(botaoMais,     4, 3, 1, 1);
       addComponent(botao4,        5, 0, 1, 1);
       addComponent(botao5,        5, 1, 1, 1);
       addComponent(botao6,        5, 2, 1, 1);
       addComponent(botaoVirgula,  5, 3, 1, 1);
       addComponent(botao1,        6, 0, 1, 1);
       addComponent(botao2,        6, 1, 1, 1);
       addComponent(botao3,        6, 2, 1, 1);
       addComponent(botao0,        6, 3, 1, 1);
       addComponent(botaoTotal,    6, 4, 1, 1);
       
       //=====tratamento de eventos de botoes====================
       trataEventosAcao handlerAcao = new trataEventosAcao();
       botaoC.addActionListener(handlerAcao);
       botaoCE.addActionListener(handlerAcao);
       botaoPerc.addActionListener(handlerAcao);
       botaoDiv.addActionListener(handlerAcao);
       botaoMultip.addActionListener(handlerAcao);
       botaoMenos.addActionListener(handlerAcao);
       botaoMais.addActionListener(handlerAcao);
       botaoTotal.addActionListener(handlerAcao);
       botaoVirgula.addActionListener(handlerAcao);
       botao1.addActionListener(handlerAcao);
       botao2.addActionListener(handlerAcao);
       botao3.addActionListener(handlerAcao);
       botao4.addActionListener(handlerAcao);
       botao5.addActionListener(handlerAcao);
       botao6.addActionListener(handlerAcao);
       botao7.addActionListener(handlerAcao);
       botao8.addActionListener(handlerAcao);
       botao9.addActionListener(handlerAcao);
       botao0.addActionListener(handlerAcao);

       //=====tratamento de eventos de focus======================
       trataEventosFocus handlerFocus = new trataEventosFocus();
       //botao1.addFocusListener(handlerFocus);

       //=====tratamento de evento de radiobuttons===============
       trataEventosRadio handlerRadio = new trataEventosRadio();
       botao2dig.addItemListener(handlerRadio);
       botao4dig.addItemListener(handlerRadio);
       botao6dig.addItemListener(handlerRadio);
       
       //=====tratamemto de eventos de teclado ======================
       //addKeyListener(this); Nao funcionou porque o frame nao fica com foco
       visor.addKeyListener(this);
       
       //===== Determina o tamanho da janela, inibe o redimencionamento, posiciona meio tela
       setSize (285, 480);
       //Dimension resVideo = Toolkit.getDefaultToolkit().getScreenSize();//verifica a resolu��o do v�deo 
       //Dimension tamForm = getSize(); 
       //setLocation((resVideo.width - tamForm.width)/2,(resVideo.height - tamForm.height)/2);//coloca o painel bem no centro da tela 
       setResizable(false);
       setVisible(true);
    }

    public static void main(String[] args) {
        
        Calculadora application = new Calculadora(null,null);
        application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    
} 

Só um comentário.

O KeyListener só dispara para quem tem foco. Pode ser um tanto inconveniente no caso da calculadora.

Para resolver isso, você pode usar um InputMap, como descrito nesse post:
http://www.guj.com.br/posts/list/47289.java#258583

Ok, valeu pela dica, boa mesmo.