Dúvida - Calculadora (com JFrame)

Olá, estou tentando criar uma calculadora em java (como fui orientada no meu curso). No material que eu tenho é dado um exemplo de cada passo da criação do código e pede para irmos completando. No caso das operações o exemplo que tinha era o da SOMA e pedia para fazer as outras. Consegui fazer SUBTRACAO e RAIZQ (raíz quadrada), mas não consigo fazer nem DIVISAO nem MULTIPLICACAO. Quando clico no botão da operação era pra continuar na tela o número que eu acabei de digitar e esperar eu digitar o próximo número, só que em vez disso aparece “0.0” Alguém pode me dizer o que está errado?

public class Calculadora extends javax.swing.JFrame {
    
    private double v1;
    private double v2;
    private Operacao operacao = Operacao.NENHUMA;
    private boolean limpar;
    
    
    public void operar(){
        switch (operacao){
            case NENHUMA:
                v1 = v2;
                break;
            case SOMA:
                v1 = v1+v2;
                break;
            case SUBTRACAO:
                v1 = v2-v1;
                break;  
            case DIVISAO:
                v1= v1/v2;
                break;
            case MULTIPLICACAO:
                v1 = v1 * v2;
                break;
            case RAIZQ:
                v1 = Math.sqrt(v2);
        }
        visor.setText(String.valueOf(v1));
        limpar = true;
    }
    public void limpar(){
        if (limpar){
            visor.setText("");
        }
        limpar = false;
    }
 public enum Operacao {
                  NENHUMA, SOMA, SUBTRACAO,DIVISAO,MULTIPLICACAO, RAIZQ
         }
    /**
     * Creates new form Calculadora
     */
    public Calculadora() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        visor = new javax.swing.JTextField();
        zero = new javax.swing.JButton();
        ponto = new javax.swing.JButton();
        um = new javax.swing.JButton();
        dois = new javax.swing.JButton();
        tres = new javax.swing.JButton();
        igual = new javax.swing.JButton();
        quatro = new javax.swing.JButton();
        cinco = new javax.swing.JButton();
        seis = new javax.swing.JButton();
        mais = new javax.swing.JButton();
        sete = new javax.swing.JButton();
        oito = new javax.swing.JButton();
        nove = new javax.swing.JButton();
        menos = new javax.swing.JButton();
        del = new javax.swing.JButton();
        div = new javax.swing.JButton();
        mult = new javax.swing.JButton();
        raizq = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        visor.setEditable(false);
        visor.setFont(new java.awt.Font("Tahoma", 0, 18)); // NOI18N
        visor.setHorizontalAlignment(javax.swing.JTextField.RIGHT);

        zero.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        zero.setText("0");
        zero.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                zeroMouseClicked(evt);
            }
        });

        ponto.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        ponto.setText(".");
        ponto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pontoActionPerformed(evt);
            }
        });

        um.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        um.setText("1");
        um.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                umActionPerformed(evt);
            }
        });

        dois.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        dois.setText("2");
        dois.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                doisActionPerformed(evt);
            }
        });

        tres.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        tres.setText("3");
        tres.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                tresActionPerformed(evt);
            }
        });

        igual.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        igual.setText("=");
        igual.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                igualActionPerformed(evt);
            }
        });

        quatro.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        quatro.setText("4");
        quatro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                quatroActionPerformed(evt);
            }
        });

        cinco.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        cinco.setText("5");
        cinco.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                cincoActionPerformed(evt);
            }
        });

        seis.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        seis.setText("6");
        seis.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                seisActionPerformed(evt);
            }
        });

        mais.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        mais.setText("+");
        mais.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                maisActionPerformed(evt);
            }
        });

        sete.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        sete.setText("7");
        sete.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                seteActionPerformed(evt);
            }
        });

        oito.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        oito.setText("8");
        oito.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                oitoActionPerformed(evt);
            }
        });

        nove.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
        nove.setText("9");
        nove.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                noveActionPerformed(evt);
            }
        });

        menos.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        menos.setText("-");
        menos.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                menosActionPerformed(evt);
            }
        });

        del.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        del.setText("DEL");
        del.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                delActionPerformed(evt);
            }
        });

        div.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        div.setText("/");
        div.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                divActionPerformed(evt);
            }
        });

        mult.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        mult.setText("*");
        mult.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                multActionPerformed(evt);
            }
        });

        raizq.setFont(new java.awt.Font("Tahoma", 1, 14)); // NOI18N
        raizq.setText("&#8730;");
        raizq.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                raizqActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(24, 24, 24)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(visor)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(zero, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                    .addComponent(div, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(um, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 53, Short.MAX_VALUE)
                                    .addComponent(quatro, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(sete, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(oito, javax.swing.GroupLayout.DEFAULT_SIZE, 53, Short.MAX_VALUE)
                                    .addComponent(dois, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(cinco, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                    .addComponent(mult, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(tres, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(ponto, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(seis, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(nove, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(raizq, javax.swing.GroupLayout.DEFAULT_SIZE, 56, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(igual, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(mais, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(menos, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(del))))
                .addContainerGap(25, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(visor, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(div, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(raizq, javax.swing.GroupLayout.DEFAULT_SIZE, 50, Short.MAX_VALUE)
                    .addComponent(mult, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(del, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(sete, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(oito, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(nove, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(menos, javax.swing.GroupLayout.PREFERRED_SIZE, 45, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(quatro, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(seis, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(cinco, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(um, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(dois, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(tres, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(zero, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(ponto, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(1, 1, 1))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(mais, javax.swing.GroupLayout.PREFERRED_SIZE, 48, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(igual, javax.swing.GroupLayout.PREFERRED_SIZE, 105, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(20, 20, 20))
        );

        pack();
    }// </editor-fold>

    private void zeroMouseClicked(java.awt.event.MouseEvent evt) {                                  
        limpar();
        visor.setText(visor.getText()+"0");
    }                                 

    private void umActionPerformed(java.awt.event.ActionEvent evt) {                                   
        limpar();
        visor.setText(visor.getText()+"1");
    }                                  

    private void doisActionPerformed(java.awt.event.ActionEvent evt) {                                     
        limpar();
        visor.setText(visor.getText()+"2");
    }                                    

    private void tresActionPerformed(java.awt.event.ActionEvent evt) {                                     
        limpar();
        visor.setText(visor.getText()+"3");
    }                                    

    private void quatroActionPerformed(java.awt.event.ActionEvent evt) {                                       
        limpar();
        visor.setText(visor.getText()+"4");
    }                                      

    private void cincoActionPerformed(java.awt.event.ActionEvent evt) {                                      
        limpar();
        visor.setText(visor.getText()+"5");
    }                                     

    private void seisActionPerformed(java.awt.event.ActionEvent evt) {                                     
        limpar();
        visor.setText(visor.getText()+"6");
    }                                    

    private void seteActionPerformed(java.awt.event.ActionEvent evt) {                                     
        limpar();
        visor.setText(visor.getText()+"7");
    }                                    

    private void oitoActionPerformed(java.awt.event.ActionEvent evt) {                                     
        limpar();
        visor.setText(visor.getText()+"8");
    }                                    

    private void noveActionPerformed(java.awt.event.ActionEvent evt) {                                     
        limpar();
        visor.setText(visor.getText()+"9");
    }                                    

    private void maisActionPerformed(java.awt.event.ActionEvent evt) {                                     
        v2 = Double.parseDouble(visor.getText());
        operacao = Operacao.SOMA;
        operar();
    }                                    

    private void menosActionPerformed(java.awt.event.ActionEvent evt) {                                      
        v2 = Double.parseDouble(visor.getText());
        operacao = Operacao.SUBTRACAO;
        operar();
    }                                     

    private void igualActionPerformed(java.awt.event.ActionEvent evt) {                                      
        v2 = Double.parseDouble(visor.getText());
        operar();
        operacao = Operacao.NENHUMA;
    }                                     

    private void delActionPerformed(java.awt.event.ActionEvent evt) {                                    
        limpar();
        visor.setText("");
    }                                   

    private void divActionPerformed(java.awt.event.ActionEvent evt) {                                    
        v2 = Double.parseDouble(visor.getText());
        operacao = Operacao.DIVISAO;
        operar();
    }                                   

    private void multActionPerformed(java.awt.event.ActionEvent evt) {                                     
        v2 = Double.parseDouble(visor.getText());
        operacao = Operacao.MULTIPLICACAO;
        operar();
    }                                    

    private void raizqActionPerformed(java.awt.event.ActionEvent evt) {                                      
        v2 = Double.parseDouble(visor.getText());
        operacao = Operacao.RAIZQ;
        operar();
    }                                     

    private void pontoActionPerformed(java.awt.event.ActionEvent evt) {
        limpar();
        visor.setText(visor.getText()+".");
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
       /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Calculadora.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Calculadora.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Calculadora.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Calculadora.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Calculadora().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify
    private javax.swing.JButton cinco;
    private javax.swing.JButton del;
    private javax.swing.JButton div;
    private javax.swing.JButton dois;
    private javax.swing.JButton igual;
    private javax.swing.JButton mais;
    private javax.swing.JButton menos;
    private javax.swing.JButton mult;
    private javax.swing.JButton nove;
    private javax.swing.JButton oito;
    private javax.swing.JButton ponto;
    private javax.swing.JButton quatro;
    private javax.swing.JButton raizq;
    private javax.swing.JButton seis;
    private javax.swing.JButton sete;
    private javax.swing.JButton tres;
    private javax.swing.JButton um;
    private javax.swing.JTextField visor;
    private javax.swing.JButton zero;
    // End of variables declaration
}

A maior parte do código foi feita pelo próprio programa (Netbeans) à medida em que fui adidionando os elementos ao JFrame.

Desculpem aí qualquer coisa, esse é meu primeiro post. Agradeço quem puder ajudar.

Tente usar o depurador. Mas provavelmente você está chamando o método operar() com algum valor inválido.

Vou mover esse tópico para o fórum de interface gráfica.

[quote]Tente usar o depurador. Mas provavelmente você está chamando o método operar() com algum valor inválido.

Vou mover esse tópico para o fórum de interface gráfica.
[/quote]
Desculpe ter criado o tópico no lugar errado.
Mas o método operar() está igual ao usado nas outras operações que estão funcionando.
O que é e como eu faço para usar esse depurador? Nunca usei.

Você usa eclipse ou netbeans?

Você está chamando operar assim que clica no sinal.

Quando você faz isso para SOMA ou SUBTRAÇÃO, a operação inicial será:
v1 = v1 + v2; ou
v1 = v2 - v1;

Que resulta em:
v1 = 0 + v2;
v1 = v2 - v1;
v1 = 0 - v1;

E por isso, o número se mantém. Entretanto, na multiplicação, o que ocorre é:
v1 = v1 * v2;

Que dá:
v1 = 0 * v2;

E como você sabe, o resultado disso é 0.

Daí seu erro. Você não pode chamar operar sempre. Você deve chamar apenas quando tiver 2 operandos.
Por isso, calculadoras normalmente só realizam o cálculo quando você clica no sinal de =.
Ou então, realizam a operação anterior quando você clica num outro sinal de operação.

Por exemplo, considere a seguinte entrada de teclas:
2
+
2 --> aqui a calculadora ainda não escreveu 4

  • –> Agora sim, calcula 2+2 e escreve 4
    5 --> Ainda não escreveu 20
    = --> Agora sim, escreve 20.

Isso também explica pq vc teve que inverter na subtração, pois seu resultado com v1 - v2 provavelmente estava saindo negativo (já que 0 - v2 dá -v2).

Uso mais o Netbeans e foi o que eu usei para esse programa. Estou começando a usar o Eclipse agora. Mas você poderia me dizer como usar o depurador nos dois?

[quote]Você está chamando operar assim que clica no sinal.

Quando você faz isso para SOMA ou SUBTRAÇÃO, a operação inicial será:
v1 = v1 + v2; ou
v1 = v2 - v1;

Que resulta em:
v1 = 0 + v2;
v1 = v2 - v1;
v1 = 0 - v1;

E por isso, o número se mantém. Entretanto, na multiplicação, o que ocorre é:
v1 = v1 * v2;

Que dá:
v1 = 0 * v2;

E como você sabe, o resultado disso é 0.

Daí seu erro. Você não pode chamar operar sempre. Você deve chamar apenas quando tiver 2 operandos.
Por isso, calculadoras normalmente só realizam o cálculo quando você clica no sinal de =.
Ou então, realizam a operação anterior quando você clica num outro sinal de operação.

Por exemplo, considere a seguinte entrada de teclas:
2
+
2 --> aqui a calculadora ainda não escreveu 4

  • –> Agora sim, calcula 2+2 e escreve 4
    5 --> Ainda não escreveu 20
    = --> Agora sim, escreve 20.
    [/quote]
    Obrigada pela explicação. Consegui ajeitar o código, bastava inverter a ordem:
    ANTES

private void menosActionPerformed(java.awt.event.ActionEvent evt) { v2 = Double.parseDouble(visor.getText()); operacao = Operacao.MULTIPLICACAO; operar(); }
DEPOIS

private void multActionPerformed(java.awt.event.ActionEvent evt) { v2 = Double.parseDouble(visor.getText()); operar(); operacao = Operacao.MULTIPLICACAO; }