2013-05-17 35 views
-4

我的計算器遇到問題;一切運行良好。但是當輸入一個操作員時,我需要先前輸入的號碼留在屏幕上,以及操作員。 我還需要一種方法來解決僅在輸入運算符後按下等於時發生的錯誤。
任何幫助,將不勝感激。由於Java計算器 - 在按下操作前讓數字保持在屏幕上

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.awt.event.*; 
import javax.swing.JLabel; 


public class Chelculator extends JPanel{ 

    //creates buttons 
    private JTextField screen; //creates the screen 
    private JButton delete, clear; //creates clear and delete buttons 
    private JButton zero, one, two, three, four, five, six, seven, eight, nine; //creates number buttons 
    private JButton plus, minus, square, divide, multiply, squareroot, point, equals; //creates operation buttons 
    private JButton mclear, mplus, mminus, mrecall; //creates memory buttons 
    double Mem; 
    double Subtract; 

    double number1, number2, result; 
    char choice; 
    static String lastCommand = null; 

    public Chelculator(){ 
    JPanel buttons = new JPanel(); 
    buttons.setBackground(Color.pink); //changes background to pink 
    plus = new JButton("+"); 
    minus = new JButton("-"); 
    square = new JButton("^"); 
    clear = new JButton("CE"); 
    divide = new JButton("÷"); 
    multiply = new JButton("x"); 
    squareroot = new JButton("√"); 
    delete = new JButton("DE"); 
    mclear = new JButton("MC"); 
    mplus = new JButton("M+"); 
    mminus = new JButton("M-"); 
    mrecall = new JButton("MR"); 
    one = new JButton("1"); 
    two = new JButton("2"); 
    three = new JButton("3"); 
    four = new JButton("4"); 
    five = new JButton("5"); 
    six = new JButton("6"); 
    seven = new JButton("7"); 
    eight = new JButton("8"); 
    nine = new JButton("9"); 
    zero = new JButton("0"); 
    equals = new JButton("="); 
    point = new JButton("."); 


    buttons.setLayout(new GridLayout(6,4)); //creates a grid for buttons 

    //adds buttons into calculator 
    buttons.add(mclear); 
    buttons.add(mrecall); 
    buttons.add(mplus); 
    buttons.add(mminus); 
    buttons.add(clear); 
    clear.setForeground(Color.red); 
    buttons.add(delete); 
    buttons.add(square); 
    buttons.add(squareroot); 
    buttons.add(plus); 
    buttons.add(minus); 
    buttons.add(divide); 
    buttons.add(multiply); 
    buttons.add(seven); 
    buttons.add(eight); 
    buttons.add(nine); 
    buttons.add(zero); 
    buttons.add(four); 
    buttons.add(five); 
    buttons.add(six); 
    buttons.add(point); 
    buttons.add(one); 
    buttons.add(two); 
    buttons.add(three); 
    buttons.add(equals); 

    EventListener Listener = new EventListener(); 
    plus.addActionListener(Listener); 
    minus.addActionListener(Listener); 
    square.addActionListener(Listener); 
    clear.addActionListener(Listener); 
    divide.addActionListener(Listener); 
    multiply.addActionListener(Listener); 
    squareroot.addActionListener(Listener); 
    delete.addActionListener(Listener); 
    mclear.addActionListener(Listener); 
    mplus.addActionListener(Listener); 
    mminus.addActionListener(Listener); 
    mrecall.addActionListener(Listener); 
    one.addActionListener(Listener); 
    two.addActionListener(Listener); 
    three.addActionListener(Listener); 
    four.addActionListener(Listener); 
    five.addActionListener(Listener); 
    six.addActionListener(Listener); 
    seven.addActionListener(Listener); 
    eight.addActionListener(Listener); 
    nine.addActionListener(Listener); 
    zero.addActionListener(Listener); 
    equals.addActionListener(Listener); 
    point.addActionListener(Listener); 

    setPreferredSize(new Dimension(270,280)); 
    screen = new JTextField(); 
    screen.setEditable(false); 
    JPanel screens = new JPanel(); 
    screens.setLayout(new BorderLayout()); 
    screens.setBackground(Color.pink); 
    screens.setPreferredSize(new Dimension(270,40)); //creates a panel and puts screen in it. This allows the size of the screen to be changed. 
    screens.add(screen); 
    setLayout(new BorderLayout()); 
    add(screens, BorderLayout.NORTH); 
    add(buttons, BorderLayout.CENTER); 
    } 

    private class EventListener implements ActionListener{ 

    public void actionPerformed(ActionEvent e){ 
    String input = e.getActionCommand(); 
     if(Character.isDigit(input.charAt(0))){ 
     screen.setText(screen.getText() + input); 
     }  

     if(e.getSource() == equals){ 
     equal(); 
     } 


     if(e.getSource() == plus){ 
     number1 = Double.parseDouble(screen.getText()); 
     screen.setText(""); 
     choice = '+'; 
     } 
     if(e.getSource() == minus){ 
     number1 = Double.parseDouble(screen.getText()); 
     screen.setText(""); 
     choice = '-'; 
     } 
     if(e.getSource() == square){ 
     screen.setText("^"); 
     } 
     if(e.getSource() == squareroot){ 
     screen.setText("√"); 
     } 
     if(e.getSource() == divide){ 
     number1 = Double.parseDouble(screen.getText()); 
     screen.setText(""); 
     choice = '/'; 
     } 

     if(e.getSource() == multiply){ 
     number1 = Double.parseDouble(screen.getText()); 
     screen.setText(""); 
     choice = 'x'; 
     } 

     if(e.getSource() == clear){ 
     screen.setText(null); 
     number1 = 0; 
     number2 = 0; 
     } 

     if(e.getSource() == delete){ 
     screen.getText().substring(0, (screen.getText().length() - 1)); 
     } 

     if(e.getSource() == point){ 
     screen.setText(screen.getText() + "."); 
     } 


     //MEMORY 
     if(e.getSource() == mplus){ 
     Mem = Mem + Double.parseDouble(screen.getText()); 
    } 

     if(e.getSource() == mrecall){ 
     screen.setText(Double.toString(Mem)); 
     } 

     if(e.getSource() == mminus){ 
     Subtract = Double.parseDouble(screen.getText()); 
     Mem = Mem - Subtract; 
    } 

    if(e.getSource() == mclear){ 
     Mem = 0; 
    } 
    } 

    public void equal(){ 
    number2 = Double.parseDouble(screen.getText()); 
    if (choice == '+'){ 
     result = number1 + number2; 
     number1 = 0; 
     number2 = 0; 

    } 
    if (choice == '-'){ 
     result = number1 - number2; 
     number1 = 0; 
     number2 = 0; 
    } 
    if (choice == '/'){ 
     result = number1/number2; 
     number1 = 0; 
     number2 = 0; 
    } 
    if (choice == '*'){ 
     result = number1 * number2; 
     number1 = 0; 
     number2 = 0; 
    } 

    screen.setText(Double.toString(result)); 
    } 

    private void assign(String no){ 
    if(screen.getText().equals("0")) 
     screen.setText(no); 
    else if(lastCommand == "="){ 
     screen.setText(no); 
     lastCommand = null; 
    } 
    else 
     screen.setText(screen.getText()+no); 
    } 
} 
} 
+0

在來這裏之前,您需要進行一些調試,以便首先隔離錯誤,然後與我們分享這些信息。調試器或println語句可以幫助你做到這一點。否則,你所做的就是傾銷你的代碼,說「請解決這個問題」。 –

+0

完全贊同關於修理我態度的評論。 :) –

回答

1

屏幕被擦除的文本,因爲你刪除它。

if(e.getSource() == plus){ 
    number1 = Double.parseDouble(screen.getText()); 
    screen.setText(""); 
    choice = '+'; 
} 

請注意screen.setText("")

此外,它是可怕的低效率,也是一種不好的做法,將輸入的號碼作爲String存儲,然後每次需要以數字形式訪問它時必須運行Double.parseDouble()。保留一個double字段,並使用它來存儲該值,因此您不必撥打parseDouble()

+0

它就是這樣,因爲那是它運行的唯一方式。當我放入任何東西時,出於某種原因而崩潰。 –