여러 기능이있는 계산기 만드는 소스 입니다.
코드입니다.
calculate.java |
import java.awt.*;
import java.awt.event.*;
public class calculate extends Frame {
public boolean setClear = true;
double number, memValue;
char op;
String numberButton[] = { "7", "8", "9", "4", "5", "6", "1", "2", "3", "0", "+/-", "." };
String calButton[] = { "/", "sqrt", "*", "%", "-", "1/X", "+", "=" };
String memoryButtonText[] = { "MC", "MR", "MS", "M+" };
String specialButtonText[] = { "Backspc", "C", "CE" };
MyDigitButton digitButton[] = new MyDigitButton[numberButton.length];
MyOperatorButton operatorButton[] = new MyOperatorButton[calButton.length];
MyMemoryButton memoryButton[] = new MyMemoryButton[memoryButtonText.length];
MySpecialButton specialButton[] = new MySpecialButton[specialButtonText.length];
Label displayLabel = new Label("0", Label.RIGHT);
Label memLabel = new Label(" ", Label.RIGHT);
final int FRAME_WIDTH = 325, FRAME_HEIGHT = 325;
final int HEIGHT = 30, WIDTH = 30, H_SPACE = 10, V_SPACE = 10;
final int TOPX = 30, TOPY = 50;
calculate(String frameText)
{
super(frameText);
int tempX = TOPX, y = TOPY;
displayLabel.setBounds(tempX, y, 240, HEIGHT);
displayLabel.setBackground(Color.orange);
displayLabel.setForeground(Color.WHITE);
add(displayLabel);
memLabel.setBounds(TOPX, TOPY + HEIGHT + V_SPACE, WIDTH, HEIGHT);
add(memLabel);
tempX = TOPX;
y = TOPY + 2 * (HEIGHT + V_SPACE);
for (int i = 0; i < memoryButton.length; i++) {
memoryButton[i] = new MyMemoryButton(tempX, y, WIDTH, HEIGHT, memoryButtonText[i], this);
memoryButton[i].setForeground(Color.RED);
y += HEIGHT + V_SPACE;
}
tempX = TOPX + 1 * (WIDTH + H_SPACE);
y = TOPY + 1 * (HEIGHT + V_SPACE);
for (int i = 0; i < specialButton.length; i++) {
specialButton[i] = new MySpecialButton(tempX, y, WIDTH * 2, HEIGHT, specialButtonText[i], this);
specialButton[i].setForeground(Color.RED);
tempX = tempX + 2 * WIDTH + H_SPACE;
}
int digitX = TOPX + WIDTH + H_SPACE;
int digitY = TOPY + 2 * (HEIGHT + V_SPACE);
tempX = digitX;
y = digitY;
for (int i = 0; i < digitButton.length; i++) {
digitButton[i] = new MyDigitButton(tempX, y, WIDTH, HEIGHT, numberButton[i], this);
digitButton[i].setForeground(Color.BLUE);
tempX += WIDTH + H_SPACE;
if ((i + 1) % 3 == 0) {
tempX = digitX;
y += HEIGHT + V_SPACE;
}
}
int opsX = digitX + 2 * (WIDTH + H_SPACE) + H_SPACE;
int opsY = digitY;
tempX = opsX;
y = opsY;
for (int i = 0; i < operatorButton.length; i++) {
tempX += WIDTH + H_SPACE;
operatorButton[i] = new MyOperatorButton(tempX, y, WIDTH, HEIGHT, calButton[i], this);
operatorButton[i].setForeground(Color.RED);
if ((i + 1) % 2 == 0) {
tempX = opsX;
y += HEIGHT + V_SPACE;
}
}
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent ev) {
System.exit(0);
}
});
setLayout(null);
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setVisible(true);
}
static String getFormattedText(double temp) {
String resText = "" + temp;
if (resText.lastIndexOf(".0") > 0)
resText = resText.substring(0, resText.length() - 2);
return resText;
}
public static void main(String[] args) {
new calculate("Calculator - JavaTpoint");
}
}
class MyDigitButton extends Button implements ActionListener {
calculate cl;
MyDigitButton(int x, int y, int width, int height, String cap, calculate clc) {
super(cap);
setBounds(x, y, width, height);
this.cl = clc;
this.cl.add(this);
addActionListener(this);
}
static boolean isInString(String s, char ch) {
for (int i = 0; i < s.length(); i++)
if (s.charAt(i) == ch)
return true;
return false;
}
public void actionPerformed(ActionEvent ev) {
String tempText = ((MyDigitButton) ev.getSource()).getLabel();
if (tempText.equals(".")) {
if (cl.setClear) {
cl.displayLabel.setText("0.");
cl.setClear = false;
} else if (!isInString(cl.displayLabel.getText(), '.'))
cl.displayLabel.setText(cl.displayLabel.getText() + ".");
return;
}
int index = 0;
try {
index = Integer.parseInt(tempText);
} catch (NumberFormatException e) {
return;
}
if (index == 0 && cl.displayLabel.getText().equals("0"))
return;
if (cl.setClear) {
cl.displayLabel.setText("" + index);
cl.setClear = false;
} else
cl.displayLabel.setText(cl.displayLabel.getText() + index);
}
}
class MyOperatorButton extends Button implements ActionListener {
calculate cl;
MyOperatorButton(int x, int y, int width, int height, String cap, calculate clc) {
super(cap);
setBounds(x, y, width, height);
this.cl = clc;
this.cl.add(this);
addActionListener(this);
}
public void actionPerformed(ActionEvent ev) {
String opText = ((MyOperatorButton) ev.getSource()).getLabel();
cl.setClear = true;
double temp = Double.parseDouble(cl.displayLabel.getText());
if (opText.equals("1/x")) {
try {
double tempd = 1 / (double) temp;
cl.displayLabel.setText(calculate.getFormattedText(tempd));
} catch (ArithmeticException excp) {
cl.displayLabel.setText("Divide by 0.");
}
return;
}
if (opText.equals("sqrt")) {
try {
double tempd = Math.sqrt(temp);
cl.displayLabel.setText(calculate.getFormattedText(tempd));
} catch (ArithmeticException excp) {
cl.displayLabel.setText("Divide by 0.");
}
return;
}
if (!opText.equals("=")) {
cl.number = temp;
cl.op = opText.charAt(0);
return;
}
// process = button pressed
switch (cl.op) {
case '+':
temp += cl.number;
break;
case '-':
temp = cl.number - temp;
break;
case '*':
temp *= cl.number;
break;
case '%':
try {
temp = cl.number % temp;
} catch (ArithmeticException excp) {
cl.displayLabel.setText("Divide by 0.");
return;
}
break;
case '/':
try {
temp = cl.number / temp;
} catch (ArithmeticException excp) {
cl.displayLabel.setText("Divide by 0.");
return;
}
break;
}// switch
cl.displayLabel.setText(calculate.getFormattedText(temp));
}
}
class MyMemoryButton extends Button implements ActionListener {
calculate cl;
MyMemoryButton(int x, int y, int width, int height, String cap, calculate clc) {
super(cap);
setBounds(x, y, width, height);
this.cl = clc;
this.cl.add(this);
addActionListener(this);
}
public void actionPerformed(ActionEvent ev) {
char memop = ((MyMemoryButton) ev.getSource()).getLabel().charAt(1);
cl.setClear = true;
double temp = Double.parseDouble(cl.displayLabel.getText());
switch (memop) {
case 'C':
cl.memLabel.setText(" ");
cl.memValue = 0.0;
break;
case 'R':
cl.displayLabel.setText(calculate.getFormattedText(cl.memValue));
break;
case 'S':
cl.memValue = 0.0;
case '+':
cl.memValue += Double.parseDouble(cl.displayLabel.getText());
if (cl.displayLabel.getText().equals("0") || cl.displayLabel.getText().equals("0.0"))
cl.memLabel.setText(" ");
else
cl.memLabel.setText("M");
break;
}
}
}
class MySpecialButton extends Button implements ActionListener {
calculate cl;
MySpecialButton(int x, int y, int width, int height, String cap, calculate clc) {
super(cap);
setBounds(x, y, width, height);
this.cl = clc;
this.cl.add(this);
addActionListener(this);
}
static String backSpace(String s) {
String Res = "";
for (int i = 0; i < s.length() - 1; i++)
Res += s.charAt(i);
return Res;
}
public void actionPerformed(ActionEvent ev) {
String opText = ((MySpecialButton) ev.getSource()).getLabel();
// check for backspace button
if (opText.equals("Backspc")) {
String tempText = backSpace(cl.displayLabel.getText());
if (tempText.equals(""))
cl.displayLabel.setText("0");
else
cl.displayLabel.setText(tempText);
return;
}
if (opText.equals("C")) {
cl.number = 0.0;
cl.op = ' ';
cl.memValue = 0.0;
cl.memLabel.setText(" ");
}
cl.displayLabel.setText("0");
cl.setClear = true;
}
}
댓글