package Calculator;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
public class Calculator extends JFrame {
private JTextField inputSpace; //화면은 JTextField로 구현
private ArrayList<String> equation = new ArrayList<String>(); //계산기능을 구현하기 위해 ArrayList에 숫자와 연산 기호를 하나씩 구분에 담아주기
private String num ="";
public JTextField getInputSpace() {
return inputSpace;
}
public void setInputSpace(JTextField inputSpace) {
this.inputSpace = inputSpace;
}
public Calculator() {
setLayout(null); //배치 관리자 별도로 사용하지 않을거에요.
inputSpace = new JTextField();
inputSpace.setEditable(false);
inputSpace.setBackground(Color.darkGray);
inputSpace.setHorizontalAlignment(JTextField.CENTER);
inputSpace.setFont(new Font("ITALIC", Font.BOLD, 50));
inputSpace.setBounds(0, 0, 300, 100);
JPanel buttonPanel = new JPanel();//버튼들을 담을 패널 생성
buttonPanel.setLayout(new GridLayout(4, 4, 2, 2));
buttonPanel.setBounds(0, 100, 300, 280);
String[] buttonOrder = {"C", "/", "x", "=", "7", "8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "0"};
JButton[] buttons = new JButton[buttonOrder.length];
for (int i = 0; i < buttonOrder.length; i++) {
buttons[i] = new JButton(buttonOrder[i]);
buttons[i].setFont(new Font("ITALIC", Font.BOLD, 25));
if (buttonOrder[i] == "C") {
buttons[i].setBackground(new Color(0xFF9300));
buttons[i].setOpaque(true);
} else if ((i >= 4 && i <= 6) || (i >= 8 && i <= 10) || (i >= 12 && i <= 14)) {
buttons[i].setBackground(Color.black);
buttons[i].setOpaque(true);
} else {
buttons[i].setBackground(Color.gray);
buttons[i].setOpaque(true);
}
buttons[i].setForeground(Color.white);
buttons[i].setOpaque(true); //텍스트 색
buttons[i].setBorderPainted(false);
buttons[i].setOpaque(true);
buttons[i].addActionListener(new PadActionListener());
buttonPanel.add(buttons[i]); //buttonPanel에 buttons 배열 넣기
}
add(inputSpace); //프레임에 텍스트필트 넣기
add(buttonPanel); //프레임에 버픈패널 넣기
setTitle("계산기"); //창의제목
setVisible(true); //창의 보이기 여부
setSize(300, 400); //창의 사이즈
setLocationRelativeTo(null); //화면 가운데에 띄우기
setResizable(true); //사이즈 조절 불가능하게 하기
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창을 닫을 때 프로그램 또한 종
}
class PadActionListener implements ActionListener{//만든 버튼에 액션 리스너를 붙여서 기능 추가하기
@Override
public void actionPerformed(ActionEvent e) {
String operation =e.getActionCommand(); //어떤 버튼이 눌렸는지 확인
if(operation.equals("C")){
inputSpace.setText(""); //"C"를 눌렀을 때 초기화시키기
}else if(operation.equals("=")){ //계산값이 나오도록 해주기
String result = Double.toString(calculate(inputSpace.getText()));
inputSpace.setText("" + result);
num ="";
}else{
inputSpace.setText(inputSpace.getText()+e.getActionCommand()); //나머지 버튼을 눌렀을 때 계산식에 추가되도록 하기(이벤트를 발생시킨 객체의 문자열을 가져온다 )
}
}
}
private void fullTextParsing(String inputText) { //계산 기능을 구현, ArrayList에 숫자와 연산 기호를 하나씩 담기.
equation.clear(); //내부의 배열을 모두 null로 초기화하고 size를 0으로 설정합니다.
for (int i = 0; i < inputText.length(); i++) {
char ch = inputText.charAt(i);
if (ch == '-' | ch == '+' | ch == 'x' | ch == '/') {
equation.add(num);
num = ""; //num을 초기화
equation.add(ch + ""); //사칙연산기호를 ArrayList에 추가.
} else {
num = num + ch; //숫자일 경우에는 num 에 더해주기.
}
}
equation.add(num); //반복문이 끝나고 최종으로 있는 num도 ArrayList에 추가
}
public double calculate(String inputText) {
fullTextParsing(inputText);
double prev = 0;
double current = 0;
String mode = ""; //mode라는 변수를 선언하여 연산 기호에 대한 처리
for (String s : equation) {
if (s.equals("+")) {
mode = "add";
} else if (s.equals("-")) {
mode = "sub";
} else if (s.equals("x")) {
mode = "mul";
} else if (s.equals("/")) {
mode = "div";
} else {
current = Double.parseDouble(s); //숫자일 경우에는 문자열을 dobule형으로
if (mode == "add") {
prev += current; //prev에 계속 계산값이 갱신되어 저장
} else if (mode == "sub") {
prev -= current;
} else if (mode == "mul") {
prev *= current;
} else if (mode == "div") {
prev /= current;
} else {
prev = current;
}
}
}
return prev; //계산값 반환
}
public static void main(String[] args) {
new Calculator();
}
}
이제 사칙연산까지는 문제없이 되는데 만약 연산기호 중복처리와 예외처리를 해야 하네요...그전에 다시 했던것들 2-3번 복습을 해야겠어요