Короче я уже это сам реализовал. Конечно не без помощи гугл. Вот код:
| Код | import java.awt.Color; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.LinkedList;
import javax.swing.BoxLayout; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel;
class CalculatorState {
CalculatorState(String numberDialed) { this.numberDialed=numberDialed; } String numberDialed; double memoryContent; double currentResult; }
abstract class CalculatorCommand {
protected Calculator calculator; abstract void execute(); abstract void undo(); }
class CalculationCommand extends CalculatorCommand {
private String firstOperand; private String operation; CalculationCommand(String operation, String firstOperand, Calculator calculator) { this.operation = operation; this.firstOperand = firstOperand; this.calculator = calculator; } void execute() { calculator.performOperation(operation,firstOperand); }
void undo() { calculator.undoOperation(operation,firstOperand); } String getOperation() { return operation; } }
class DialingCommand extends CalculatorCommand{
private String dialed; DialingCommand(String dialed, Calculator calculator) { this.dialed=dialed; this.calculator = calculator; } void execute() { calculator.dial(dialed); }
void undo() { calculator.undoDial(dialed); } }
class ClearCommand extends CalculatorCommand{
private String dialed; ClearCommand(String dialed, Calculator calculator) { this.dialed=dialed; this.calculator = calculator; } void execute() { calculator.clear(); }
void undo() { calculator.undoClear(dialed); } }
class NumberButton extends JButton { private int number; public NumberButton(int number) { super(Integer.toString(number)); this.number=number; } public int getNumber() { return number; }
}
class OperationButton extends JButton { private String operation; public OperationButton(String operation) { super(operation); this.operation=operation; } public String getOperation() { return operation; }
}
public class Calculator extends JApplet{
private CalculatorState current = new CalculatorState(""); private LinkedList<CalculatorCommand> commands = new LinkedList<CalculatorCommand>(); private CalculationCommand lastOperation; private JLabel display = new JLabel(); void dial (String todial) { current.numberDialed=current.numberDialed+todial; display.setText(current.numberDialed); }
void undoDial (String dialed) { if (current.numberDialed.length()>dialed.length()) { current.numberDialed=current.numberDialed.substring(0,current.numberDialed.length()-dialed.length()); } else { current.numberDialed=""; } display.setText(current.numberDialed); } void performOperation(String operation, String firstOperand) { if (operation == "+") { current.numberDialed=Double.toString(Double.valueOf(current.numberDialed)+Double.valueOf(firstOperand)); } else if (operation == "-") { current.numberDialed=Double.toString(Double.valueOf(firstOperand)-Double.valueOf(current.numberDialed)); } else if (operation == "*") { current.numberDialed=Double.toString(Double.valueOf(current.numberDialed)*Double.valueOf(firstOperand)); } else if (operation == "/") { current.numberDialed=Double.toString(Double.valueOf(firstOperand)/Double.valueOf(current.numberDialed)); } display.setText(current.numberDialed); } void undoOperation(String operation, String firstOperand) { current.numberDialed=firstOperand; display.setText(current.numberDialed); } void clear() { if (current.numberDialed.length()>1) { current.numberDialed=current.numberDialed.substring(0,current.numberDialed.length()-1); } else { current.numberDialed=""; } display.setText(current.numberDialed); } void undoClear(String dialed) { current.numberDialed=dialed; display.setText(current.numberDialed); } private ActionListener nbl = new ActionListener() {
public void actionPerformed(ActionEvent arg0) { CalculatorCommand cc = new DialingCommand(Integer.toString(((NumberButton)arg0.getSource()).getNumber()),Calculator.this); commands.add(cc); cc.execute(); } };
private ActionListener obl = new ActionListener() {
public void actionPerformed(ActionEvent arg0) { if (current.numberDialed.charAt(current.numberDialed.length()-1)=='.') { current.numberDialed=current.numberDialed+"0"; } CalculationCommand cc = new CalculationCommand(((OperationButton)arg0.getSource()).getOperation(),current.numberDialed,Calculator.this); if (lastOperation != null) { lastOperation.execute(); } lastOperation=cc; commands.add(cc); if (cc.getOperation() != "=") { current.numberDialed=""; } display.setText(current.numberDialed); } }; private ActionListener pbl = new ActionListener() {
public void actionPerformed(ActionEvent arg0) { if (! current.numberDialed.contains(".")) { CalculatorCommand cc = new DialingCommand(".",Calculator.this); commands.add(cc); cc.execute(); } } };
private ActionListener ubl = new ActionListener() {
public void actionPerformed(ActionEvent arg0) { if (!commands.isEmpty()) { commands.removeLast().undo(); } } };
private ActionListener cbl = new ActionListener() {
public void actionPerformed(ActionEvent arg0) { ClearCommand cc = new ClearCommand(current.numberDialed, Calculator.this); commands.add(cc); cc.execute(); } }; public void init() { JButton nb[] = new NumberButton[10]; JPanel buttons = new JPanel(new GridLayout(4,4)); for (int i=7; i<=9 ; i++){ nb[i-1]=new NumberButton(i); nb[i-1].addActionListener(nbl); buttons.add(nb[i-1]); } OperationButton subb = new OperationButton("-"); subb.addActionListener(obl); buttons.add(subb); for (int i=4; i<=6 ; i++){ nb[i-1]=new NumberButton(i); nb[i-1].addActionListener(nbl); buttons.add(nb[i-1]); } OperationButton addb = new OperationButton("+"); addb.addActionListener(obl); buttons.add(addb); for (int i=1; i<=3 ; i++){ nb[i-1]=new NumberButton(i); nb[i-1].addActionListener(nbl); buttons.add(nb[i-1]); }
OperationButton mulb = new OperationButton("*"); mulb.addActionListener(obl); buttons.add(mulb);
OperationButton pointb = new OperationButton("."); pointb.addActionListener(pbl); buttons.add(pointb); nb[9]=new NumberButton(0); nb[9].addActionListener(nbl); buttons.add(nb[9]); OperationButton equalb = new OperationButton("="); equalb.addActionListener(obl); buttons.add(equalb); OperationButton divb = new OperationButton("/"); divb.addActionListener(obl); buttons.add(divb); Container cp = getContentPane(); cp.setLayout(new BoxLayout(cp,BoxLayout.Y_AXIS)); JPanel displaybg = new JPanel(); displaybg.setBackground(new Color((float)1,(float)1,(float)1)); displaybg.add(display);
JButton clb=new JButton("Clear"); clb.addActionListener(cbl); JPanel lowBtnPanel = new JPanel(); lowBtnPanel.add(clb); JButton undob = new JButton("Undo"); undob.addActionListener(ubl); lowBtnPanel.add(undob); cp.add(displaybg); cp.add(buttons); cp.add(lowBtnPanel); } public static void main(String[] args) {
JApplet calculator = new Calculator(); JFrame mainFrame = new JFrame("Simple Calculator"); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.getContentPane().add(calculator); mainFrame.setSize(200,250); calculator.init(); calculator.start(); mainFrame.setVisible(true); }
}
|
На студенческую работу сойдет |