package calculator;
public interface CalcModel
{
void processCommand(Commands cmd);
String getDisplayText();
String getLabelText();
}
package calculator;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class Calculator extends JFrame implements ActionListener
{
private JTextField txtDisplay;
private JTextField label;
private CalcModel model;
public Calculator()
{
super("Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
pack();
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
model = new ExtendDefaultCalcModel();
}
private void initComponents()
{
JPanel contentPane = new JPanel(new BorderLayout());
contentPane.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
txtDisplay = new JTextField();
txtDisplay.setEditable(false);
txtDisplay.setBackground(Color.WHITE);
txtDisplay.setHorizontalAlignment(JTextField.RIGHT);
add(txtDisplay, BorderLayout.NORTH);
//
Commands[] cmdButtons = Commands.values();
// group 1
JPanel pnlGroup1 = new JPanel(new GridLayout(4, 1, 5, 5));
for (int btnIndex = 0; btnIndex < 3; btnIndex++)
{
CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
btn.addActionListener(this);
pnlGroup1.add(btn);
}
add(pnlGroup1, BorderLayout.WEST);
// group2
JPanel pnlGroup2 = new JPanel(new GridLayout(4, 5, 5, 5));
for (int btnIndex = 3; btnIndex < cmdButtons.length - 4; btnIndex++)
{
CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
btn.addActionListener(this);
pnlGroup2.add(btn);
}
add(pnlGroup2, BorderLayout.EAST);
// group 3
JPanel pnlGroup3 = new JPanel(new GridLayout(1, 5, 5, 5));
label = new JTextField();
label.setEditable(false);
label.setBackground(Color.lightGray);
label.setHorizontalAlignment(JTextField.RIGHT);
pnlGroup3.add(label);
for (int btnIndex = cmdButtons.length - 4; btnIndex < cmdButtons.length; btnIndex++)
{
CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
btn.addActionListener(this);
pnlGroup3.add(btn);
}
add(pnlGroup3, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent arg0)
{
CommandButton btn = (CommandButton) arg0.getSource();
model.processCommand(btn.getCommand());
txtDisplay.setText(model.getDisplayText());
label.setText(model.getLabelText());
}
}
package calculator;
import javax.swing.JButton;
@SuppressWarnings("serial")
public class CommandButton extends JButton
{
private Commands cmd;
public Commands getCommand()
{
return cmd;
}
public CommandButton(Commands cmd)
{
super(cmd.displayText());
this.cmd = cmd;
}
}
package calculator;
public enum Commands
{
BACKSPACE("Backspace"),
CE("CE"),
C("C"),
NR_7("7", 7),
NR_8("8", 8),
NR_9("9", 9),
DIV("/"),
SQRT("sqrt"),
NR_4("4", 4),
NR_5("5", 5),
NR_6("6", 6),
MUL("*"),
MOD("%"),
NR_1("1", 1),
NR_2("2", 2),
NR_3("3",3),
MINUS("-"),
DIV_BY("1/x"),
NR_0("0", 0),
PLUS_MINUS("+/-"),
PERIOD("."),
PLUS("+"),
EQUALS("="),
MS("MS"),
M_PLUS("M+"),
MR("MR"),
MC("MC");
private int number;
private String displayText;
int number()
{
return number;
}
String displayText()
{
return displayText;
}
Commands(String displayText)
{
this(displayText, -1);
}
Commands(String displayText, int number)
{
this.displayText = displayText;
this.number = number;
}
boolean usable()
{
switch (this)
{
case DIV:
case PLUS:
case MINUS:
case MUL:
case MOD:
return true;
default:
return false;
}
}
}
package calculator;
public class DefaultCalcModel implements CalcModel
{
private double currentRezult;
protected double currentValue;
private Commands operatie;
private Commands lastButton;
private int virgula;
public DefaultCalcModel()
{
currentRezult = 0;
currentValue = 0;
operatie = null;
lastButton = null;
virgula = 1;
}
public void processCommand(Commands cmd)
{
if (cmd.number() != -1)
{
addCifre(cmd.number());
lastButton = cmd;
}
else
{
switch (cmd)
{
case BACKSPACE:
String transform, end = "", start = "";
transform = Double.toString(currentValue);
int ok = 1;
if (((currentValue - (int) currentValue) == 0) && (Math.abs(currentValue) < 10))
currentValue = 0;
else
for (int i = transform.length() - 1; (i > -1) && (ok == 1); i--)
if ((transform.charAt(i) != '.')
&& (transform.charAt(i) != '0')) {
ok = 0;
if (i > 0)
start = transform.substring(0, i);
if (i < transform.length() - 1)
end = transform.substring(i + 1);
start.concat(end);
currentValue = Double.valueOf(start);
}
lastButton = null;
break;
case CE:
lastButton = null;
currentValue = 0;
virgula = 1;
break;
case C:
operatie = null;
lastButton = null;
currentValue = 0;
currentRezult = 0;
virgula = 1;
break;
case DIV:
case MUL:
case PLUS:
case MINUS:
if (operatie != null)
{
if (operatie.usable())
this.execOperatie();
}
operatie = cmd;
currentRezult = currentValue;
lastButton = cmd;
break;
case MOD:
currentValue /= 100;
if (operatie != null)
{
if (operatie.usable())
this.execOperatie();
}
operatie = null;
currentRezult = currentValue;
lastButton = cmd;
break;
case EQUALS:
if (operatie != null)
if (operatie.usable())
{
this.execOperatie();
operatie = cmd;
}
break;
case PLUS_MINUS:
currentValue *= -1;
break;
case SQRT:
lastButton = cmd;
currentValue = Math.sqrt(currentValue);
break;
case DIV_BY:
lastButton = cmd;
currentValue = 1 / currentValue;
break;
case PERIOD:
if (virgula == 1)
virgula = 10;
lastButton = cmd;
break;
}
}
}
public String getDisplayText()
{
return String.valueOf(currentValue);
}
private void addCifre(int cifre)
{
if (lastButton != null)
switch (lastButton)
{
case NR_0:
case NR_1:
case NR_2:
case NR_3:
case NR_4:
case NR_5:
case NR_6:
case NR_7:
case NR_8:
case NR_9:
case PLUS_MINUS:
case PERIOD:
break;
default:
virgula = 1;
currentValue = 0;
}
if (currentValue >= 0)
currentValue = (currentValue * (virgula == 1 ? 10 : virgula) + cifre) / virgula;
else
currentValue = (-1 * (Math.abs(currentValue)
* (virgula == 1 ? 10 : virgula) + cifre)) / virgula;
if (virgula != 1)
virgula *= 10;
}
private void execOperatie()
{
switch (operatie)
{
case DIV:
currentValue = currentRezult / currentValue;
break;
case MUL:
currentValue = currentRezult * currentValue;
break;
case MOD:
currentValue = currentRezult % currentValue;
break;
case PLUS:
currentValue = currentRezult + currentValue;
break;
case MINUS:
currentValue = currentRezult - currentValue;
break;
}
}
public String getLabelText()
{
return "";
}
public void setCurrentValue(Double value)
{
currentValue = value;
}
}
package calculator;
public class ExtendDefaultCalcModel extends DefaultCalcModel
{
private Double memmored;
public ExtendDefaultCalcModel()
{
super();
memmored = null;
}
public void processCommand(Commands cmd)
{
boolean mem_button;
switch (cmd)
{
case MC:
case MS:
case M_PLUS:
case MR:
mem_button = true;
break;
default:
mem_button = false;
}
if (!mem_button)
super.processCommand(cmd);
else
switch (cmd)
{
case MC:
memmored = null;
break;
case MS:
memmored = super.currentValue;
this.getLabelText();
break;
case M_PLUS:
if (memmored == null)
memmored = new Double(super.currentValue);
else
memmored += super.currentValue;
this.getLabelText();
break;
case MR:
super.setCurrentValue(memmored);
this.getLabelText();
}
}
public String getLabelText()
{
if (memmored != null)
return String.valueOf(memmored);
else
return "";
}
}
package calculator;
public class Main
{
public static void main(String[] args)
{
new Calculator();
}
}
Niciun comentariu:
Trimiteți un comentariu