package pack;
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 Calc extends JFrame implements ActionListener{
private JTextField txtDisplay;
private CalcModel model;
public Calc(){
super("Calculator");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
initComponents();
setResizable(false);
setLocationRelativeTo(null);
setVisible(true);
pack();
model = new DefaultCalcModel();
}
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();
for (int btnIndex = 0; btnIndex < 3; btnIndex++) {
CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
btn.addActionListener(this);
pnlGroup1.add(btn);
}
add(pnlGroup1, BorderLayout.EAST);
// group2
JPanel pnlGroup2 = new JPanel(new GridLayout(4, 5, 5, 5));
for (int btnIndex = 3; btnIndex < cmdButtons.length; btnIndex++) {
CommandButton btn = new CommandButton(cmdButtons[btnIndex]);
btn.addActionListener(this);
pnlGroup2.add(btn);
}
add(pnlGroup2, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e){
CommandButton btn = (CommandButton) e.getSource();
model.processCommand(btn.getCommand());
txtDisplay.setText(model.getDisplayText());
}
}
package pack;
public interface CalcModel {
void processCommand(Commands cmd);
String getDisplayText();
}
package pack;
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 pack;
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("=");
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;
}
}
package pack;
public class DefaultCalcModel implements CalcModel {
private double currentRezult;
private double currentValue;
private String operatie;
private int flag;
private double k;
public DefaultCalcModel() {
currentRezult = 0;
currentValue = 0;
}
public void processCommand(Commands cmd) {
if (cmd.number() != -1) {
addCifre(cmd.number());
}
else {
switch (cmd) {
case BACKSPACE:
break;
case CE:
currentValue = 0;
break;
case C:
currentValue = 0;
currentRezult = 0;
break;
case MUL:
flag=0;
currentRezult=currentValue;
currentValue=0;
operatie="*";
break;
case DIV:
flag=0;
currentRezult=currentValue;
currentValue=0;
operatie="/";
break;
case MINUS:
flag=0;
currentRezult=currentValue-currentRezult;
currentValue=0;
operatie="-";
break;
case PLUS:
flag=0;
System.out.println(currentValue);
currentRezult=currentValue+currentRezult;
System.out.println(currentRezult);
currentValue=0;
operatie="+";
break;
case MOD:
flag=0;
currentRezult=currentValue;
currentValue=0;
operatie="%";
break;
case DIV_BY:
flag=0;
currentRezult=currentValue;
currentValue=1/currentRezult;
break;
case PLUS_MINUS:
flag=0;
currentRezult=currentValue;
currentRezult=(-1)*currentRezult;
currentValue=currentRezult;
System.out.println(currentValue);
break;
case SQRT:
flag=0;
currentRezult=currentValue;
currentValue=Math.sqrt(currentRezult);
break;
case PERIOD:
k=0;
flag=1;
break;
case EQUALS:
if(operatie.compareTo("*")==0)
{
currentValue*=currentRezult;
}
else
{
if(operatie.compareTo("/")==0)
{
currentRezult/=currentValue;
currentValue=currentRezult;
}
else
{
if(operatie.compareTo("-")==0)
{
currentRezult-=currentValue;
currentValue=currentRezult;
}
else
if(operatie.compareTo("+")==0)
{
currentValue+=currentRezult;
}
else
{
if(operatie.compareTo("%")==0)
{
currentRezult%=currentValue;
currentValue=currentRezult;
}
else
{
currentValue=Math.sqrt(currentRezult);
}
}
}
}
break;
}
}
}
public String getDisplayText() {
return ""+currentValue;
}
private void addCifre(int cifre) {
if(flag==0)
{
currentValue=currentValue*10+cifre;
}
else
{
k++;
double r=Math.pow(10, k);
currentValue=(currentValue*r+cifre)/r;
}
}
}
package pack;
public class Main {
public static void main(String[] args) {
new Calc();
}
}
Niciun comentariu:
Trimiteți un comentariu