728x90
import java.awt.Color; //JFrame 뺴고 자동입력 됌
import java.awt.Font;
import java.awt.GridLayout; // Grid문을 사용하기위해 선언
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JFrame; // import문을 선언 JFrame에 커서올리고 Ctrl + Shift + O 입력시 자동입력
import javax.swing.JPanel;
import javax.swing.JTextField;
@SuppressWarnings("serial")
public class Calculator extends JFrame { // JFrame를 사용하기위해 상속시킴
private JTextField inputSpace;
private String num= "";
private ArrayList<String> equation = new ArrayList<String>();
public Calculator() {
setLayout(null); // GUI 형식을 지정할 수 있다.
inputSpace = new JTextField(); // inputSpace에는 GUI로 텍스트를 입력받는 JTextField로 구현
inputSpace.setEditable(false); // 수정이 불가능하도록 만듬
inputSpace.setBackground(Color.white); // 배경색을 지정
inputSpace.setHorizontalAlignment(JTextField.RIGHT); // 오른쪽으로 정렬한다.
inputSpace.setFont(new Font("Arial", Font.BOLD, 50)); // 폰트 Arial로 지정
inputSpace.setBounds(8,10,270,70); // x : 8 y : 10 의 위치에 270x70의 크기로 설정
//버튼패널
JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(4,4,10,10)); // 칸수, 세로 칸수, 좌우간격, 상하간격을 입력 4행 4열로 총 16칸을 만들었다.
buttonPanel.setBounds(8, 90, 270, 235); //가로위치,세로위치,가로길이,세로길이
String button_names[] = {"C","÷","×","=","7","8","9","+","4","5","6","-","1","2","3","0"}; // 16칸에 각 값 입력
JButton buttons[] = new JButton[button_names.length];
for (int i=0; i<button_names.length; i++) {
buttons[i] = new JButton(button_names[i]);
buttons[i].setFont(new Font("Arial",Font.BOLD, 20)); // 1씩 증가하면서 button_names에 있는 값들을 삽입해준다. 폰트사이즈를 지정함
if(button_names[i] =="C" )buttons[i].setBackground(Color.red); // C문자일시 백그라운드 색상을 "RED"로 변경
else if ((i >= 4 && i <= 6) || (i >= 8 && i<= 10) || (i >= 12 && i <= 15)) buttons[i].setBackground(Color.black);
// 숫자는 모두 black로 지정 i는 순번대로 입력된 숫자를 직접 입력했다.
else buttons[i].setBackground(Color.GRAY); // 나머지는 "GRAY"로 지정
buttons[i].setForeground(Color.white); // 폰트는 "Whight"로 지정
buttons[i].setBorderPainted(false); // 테두리 없애기
buttons[i].addActionListener(new PadActionListener()); // 버튼이 클릭될 시 동작하도록 설정
buttonPanel.add(buttons[i]); // 아까만들어둔 버튼판넬에 값을 집 어넣는다.
}
add(inputSpace); // 기본 인터페이스를 불러온다.
add(buttonPanel); // 위에서 만든 버튼들에 값을넣어 불러온다.
setTitle("계산기"); // 창의 제목
setVisible(true); // 창을 보화면에 나타내도록 설정
setSize(300, 370); // 창의 사이즈 설정
setLocationRelativeTo(null); // 창을 한가운데로 나오게 한다.
setResizable(false); // 창의 사이즈 설정이 불가능 하도록 만든다.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 창을 닫을때 실행중인 프로그램도 함께 종료시킨다.
}
class PadActionListener implements ActionListener{ // 선언문 ActionListener을 상속시켜서 사용한다.
public void actionPerformed(ActionEvent e) { // 버튼이 눌려질시 실행
String operation = e.getActionCommand(); // 눌려진 버튼의 값을 operation에 삽입(비교해야함)
if (operation.equals("C")) { // 값이 C 일시 값 패널을 비운다.
inputSpace.setText("");
}else if (operation.equals("=")) { // 값이 = 일시 계산한 값을 넣는다.
String result = Double.toString(calculate(inputSpace.getText())); // result에 숫자값을 해당하는 문자열 표현으로 변환한 후 삽입 ( calculate는 계산식 )
inputSpace.setText(""+result); // Text패널에 값을 삽입한다.
num = ""; // num값은 초기화 시킨다.
}else {
inputSpace.setText(inputSpace.getText() + e.getActionCommand()); // = 이 아닐시 원레있던 숫자값에 새로 추가된 숫자 값을 더한다. ( 더하기가 아닌 숫자를 그대로 올린다.)
}
}
}
private void fullTextParsing(String inputText) { // inputText 호출시 실행됨 ( 클릭이벤트로 입력되는값을 화면에 띄우기위한 식)
equation.clear(); // 변수를 초기화한다.
for(int i=0; i < inputText.length(); i++) { // inputText안에 있는 값들의 수만큼 비교한다.
char ch = inputText.charAt(i); // 변수ch에 배열안에 있는 변수중 i 번째에 있는 값을 ch에 삽입
if(ch == '-' | ch == '+' | ch == '×' | ch == '÷' ) { // ch가 사칙연산인지 확인
equation.add(num); // 사칙연산일시 밑에있는 else에서 넣어놓은 값을 넣어준다(숫자)
num =""; // num값은 다시 초기화
equation.add(ch+ ""); // 사칙연산이 들어가있는 ch값을 넣어준다. ex) 숫자2, + 를 넣으면 우산 if가 else가되서 먼저 2가 equation에 들어간 후 다시 돌아와서 true가 되자마자 num이 먼저 삽입되서 숫자가 들어간 후 사칙연산이 들어가게됌
} else {
num = num + ch; // 숫자면 숫자값을 저장한다.
}
}
equation.add(num); // 마지막 값이 사칙연산이 아닐시 else에 있는 num값을 넣어주며 종료(값이 모두 들어간 상태) '=' 이 입력되면 calculate가 호출됌
}
public double calculate(String inputText) { // '='이 입력됐을때 호출됨
fullTextParsing(inputText); // 텍스트에 있는 값을 모두 불러온다.
double prev = 0; // 변수 선언 소수점까지 해야하기에 double 선언
double current = 0;
String mode = ""; // 문자변수 mode 초기화
for (String s : equation) { // for문 ':' 를 사용하면 (대입받을변수 : 배열명)으로 입력, 배열의 길이만큼 for문이 돌아가게된다.
if(s.equals("+")) { // fullTextParsing의 for문 종료 후에 넣어놓은 equation값(모든값)에서 어떤 사칙연산인지 확인한다.
mode = "add";
} else if (s.equals("-")) {
mode = "sub";
} else if (s.equals("×")) {
mode = "mul";
} else if (s.equals("÷")) {
mode = "div"; // 사칙연산은 읽어올 수 없으므로 mode에 변수를 넣어주고 계산식을 넣는다.
} else {
current = Double.parseDouble(s); // 사칙연산이 아니라면 계산할 수 있도록 문자열을 정수형으로 변경한다.
if(mode == "add") {
prev += current;
} else if (mode == "sub") {
prev -= current;
} else if (mode == "mul") {
prev *= current;
} else if (mode == "div") {
prev /= current;
} else {
prev = current; // prev에 current 값을 넣어준다. ( 처음값 )
}
}
}
return prev; // 계산된 prev값을 넣어준다.
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Calculator(); // 위에 있는 클래스를 호출하여 화면이 나온다.
}
}
728x90
'혼자해보는 공부' 카테고리의 다른 글
Java 계산기 만들면서 풀이하기(3) (0) | 2022.04.06 |
---|---|
java계산기 사칙연산까지 해본 후 .. (0) | 2022.04.03 |
Java 계산기 만들면서 풀이하기(1) (0) | 2022.03.29 |
[19. static메서드와 인스턴스메서드, 오버로딩, 생성자] (0) | 2022.03.23 |
[18. 메서드, return, 매개변수] (0) | 2022.03.23 |