- calculator 프로젝트를 생성한다.
JFrame
을 이용해 GUI 구현한다. -> JFame 상속
코드
package A1_materializeShape;
import javax.swing.JFrame;
public class Calculator extends JFrame {
public Calculator() {
//창의 제목, 사이즈, 보이기 여부 등을 지정
setTitle("계산기");
setVisible(true);
setSize(300, 370);
//화면의 가운데에 띄움
setLocationRelativeTo(null);
//사이즈 조절 안됨
setResizable(false);
//창을 닫을 경우 실행 중인 프로그램도 같이 종료
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Calculator();
}
}
실행결과
창의 사이즈, 위치, 레이아웃 지정
1.inputSpace.set00000
로 전체적인 레이아웃을 구성한다.
코드
package A1_materializeShape;
import java.awt.color.*;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.JFrame;
public class Calculator extends JFrame {
private JTextField inputSpace;
public Calculator() {
//계산기의 화면과 버튼을 붙임 - 기본레이아웃 사용
setLayout(null);
//빈공간의 JTextField 생성
inputSpace = new JTextField();
//편집가능여부 : 불가능 (버튼만 사용)
inputSpace.setEditable(false);
//배경색 설정
inputSpace.setBackground(Color.WHITE);
//정렬위치 설정
inputSpace.setHorizontalAlignment(JTextField.RIGHT);
//글씨체 설정
inputSpace.setFont(new Font("Arial", Font.BOLD, 50));
//위치와 크기 (x=8, y=10의 위치에 270X70의 크기)
inputSpace.setBounds(8, 10, 270, 70);
add(inputSpace);
//창의 제목, 사이즈, 보이기 여부 등을 지정
setTitle("계산기");
setVisible(true);
setSize(300, 370);
//화면의 가운데에 띄움
setLocationRelativeTo(null);
//사이즈 조절 안됨
setResizable(false);
//창을 닫을 경우 실행 중인 프로그램도 같이 종료
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new Calculator();
}
}
실행결과
계산기 버튼 생성, 각 버튼에 대한 값 지정과 계산기능 추가
1. ArrayList, Action 메소드를 추가
2. 각 버튼의 배열과 그 배열값에 나타낼 문자를 지정
3. 조건을 통해 버튼을 눌렀을 때의 반응을 지정
코드
package A1_materializeShape;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Calculator extends JFrame {
private JTextField inputSpace;
//계산식의 숫자를 담을 변수 num
private String num = "";
//계산 기능을 구현하기 위해 ArrayList에 숫자와 연산기호를 하나씩 구분해 담음
private ArrayList<String> equation = new ArrayList<String>();
public Calculator() {
//계산기의 화면과 버튼을 붙임 - 기본레이아웃 사용
setLayout(null);
//빈공간의 JTextField 생성
inputSpace = new JTextField();
//편집가능여부 : 불가능 (버튼만 사용)
inputSpace.setEditable(false);
//배경색 설정
inputSpace.setBackground(Color.WHITE);
//정렬위치 설정
inputSpace.setHorizontalAlignment(JTextField.RIGHT);
//글씨체 설정
inputSpace.setFont(new Font("Arial", Font.BOLD, 50));
//위치와 크기 (x=8, y=10의 위치에 270X70의 크기)
inputSpace.setBounds(8, 10, 270, 70);
//버튼을 만들 패널
JPanel buttonPanel = new JPanel();
//레이아웃 지정 - 격자형태로 배치해주는 GridLayout 사용
//GridLayout(가로 칸수, 세로 칸수, 좌우 간격, 상하 간격)
buttonPanel.setLayout(new GridLayout(4,4,10,10));
//위치와 크기 설정
buttonPanel.setBounds(8, 90, 270, 235);
//계산기 버튼의 글자를 차례대로 배열에 저장
String button_names[] = {"C", "/", "X", "=", "7","8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "0"};
//버튼들의 배열
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));
//버튼의 색 지정
if (button_names[i] == "C")buttons[i].setBackground(Color.RED);
else if ((i >=4 && i <=6)||(i >=8 && i<=10)||(i>=12 && i<=14))buttons[i].setBackground(Color.BLACK);
else buttons[i].setBackground(Color.GRAY);
//글자색 지정
buttons[i].setForeground(Color.white);
//테두리 삭제
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);
}
//만들어놓은 버튼에 액션 리스너 기능 추가
//액션리스너를 상속시켜주고 actionPerformed(ActionEvent e)메소드로 이벤트 처리
class PadActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
//어떤 버튼이 눌렀는지 알아냄
String operation = e.getActionCommand();
//C가 눌렸을 경우 위의 계산식 내용을 지워줌
if (operation.equals("C")) {
inputSpace.setText("");
// =가 눌렸을 경우 위의 입력된 식을 계산, 계산값이 나오도록 함
} 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) {
equation.clear();
//계산식의 글자를 하나하나 거쳐감
for (int i=0; i < inputText.length(); i++) {
char ch = inputText.charAt(i);
//연산기호가 나오면 ArrayList에 추가되고 초기화
if (ch=='-' || ch =='+' || ch=='X' || ch=='/') {
//연산기호를 만났다 == 앞은 숫자
//숫자를 ArrayList에 추가
equation.add(num);
//num 초기화
num ="";
//연산기호를 Array에 추가
equation.add(ch + "");
}else {
//나머지는 그냥 숫자 처리
num = num + ch;
}
}
//반복문 끝나고 남아있는 숫자값 추가
equation.add(num);
}
//계산기능
public double calculate(String inputText) {
fullTextParsing(inputText);
//위의 메소드를 실행하면 ArrayList에 숫자와 연산 기호가 담김
double prev = 0;
double current = 0;
//연산 기호에 대한 처리를 위한 변수
String mode = "";
//+일 경우 add, -일 경우 sub, x의 경우 mul, /일 경우 div
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 {
//숫자일 경우 문자열을 Double로 형변환
current = Double.parseDouble(s);
//mode값에 따라 처리, prev는 계속 계산값이 갱신됨.
if (mode.equals("add")) {
prev += current;
}else if (mode.equals("sub")) {
prev -= current;
}else if (mode.equals("mul")) {
prev *= current;
}else if (mode.equals("div")) {
prev /= current;
}else {
prev = current;
}
}
}
//계산값 prev 반환
return prev;
}
public static void main(String[] args) {
new Calculator();
}
}
실행결과
- 사용자는 코드가 원하는 정상의 식을 입력하지 않았을 때 (ex. 4+++5) 정상처리 할 수 없음.
- 현재 코드로는 첫번째 값에 음수를 입력할 수 없음.
코드
package A1_materializeShape;
import java.awt.Color;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
public class Calculator extends JFrame {
private JTextField inputSpace;
//계산식의 숫자를 담을 변수 num
private String num = "";
//방금 누른 버튼을 기억하는 변수 prev_operation
private String prev_operation = "";
//계산 기능을 구현하기 위해 ArrayList에 숫자와 연산기호를 하나씩 구분해 담음
private ArrayList<String> equation = new ArrayList<String>();
public Calculator() {
//계산기의 화면과 버튼을 붙임 - 기본레이아웃 사용
setLayout(null);
//빈공간의 JTextField 생성
inputSpace = new JTextField();
//편집가능여부 : 불가능 (버튼만 사용)
inputSpace.setEditable(false);
//배경색 설정
inputSpace.setBackground(Color.WHITE);
//정렬위치 설정
inputSpace.setHorizontalAlignment(JTextField.RIGHT);
//글씨체 설정
inputSpace.setFont(new Font("Arial", Font.BOLD, 50));
//위치와 크기 (x=8, y=10의 위치에 270X70의 크기)
inputSpace.setBounds(8, 10, 270, 70);
//버튼을 만들 패널
JPanel buttonPanel = new JPanel();
//레이아웃 지정 - 격자형태로 배치해주는 GridLayout 사용
//GridLayout(가로 칸수, 세로 칸수, 좌우 간격, 상하 간격)
buttonPanel.setLayout(new GridLayout(4,4,10,10));
//위치와 크기 설정
buttonPanel.setBounds(8, 90, 270, 235);
//계산기 버튼의 글자를 차례대로 배열에 저장
String button_names[] = {"C", "/", "X", "=", "7","8", "9", "+", "4", "5", "6", "-", "1", "2", "3", "0"};
//버튼들의 배열
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));
//버튼의 색 지정
if (button_names[i] == "C")buttons[i].setBackground(Color.RED);
else if ((i >=4 && i <=6)||(i >=8 && i<=10)||(i>=12 && i<=14))buttons[i].setBackground(Color.BLACK);
else buttons[i].setBackground(Color.GRAY);
//글자색 지정
buttons[i].setForeground(Color.white);
//테두리 삭제
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);
}
//만들어놓은 버튼에 액션 리스너 기능 추가
//액션리스너를 상속시켜주고 actionPerformed(ActionEvent e)메소드로 이벤트 처리
class PadActionListener implements ActionListener{
public void actionPerformed(ActionEvent e) {
//어떤 버튼이 눌렀는지 알아냄
String operation = e.getActionCommand();
//C가 눌렸을 경우 위의 계산식 내용을 지워줌
if (operation.equals("C")) {
inputSpace.setText("");
// =가 눌렸을 경우 위의 입력된 식을 계산, 계산값이 나오도록 함
} else if (operation.equals("=")) {
//밑의 메소들을 이용하여 계산, 계산식 화면에 값을 띄워줌
String result = Double.toString(calculate(inputSpace.getText()));
inputSpace.setText(""+ result);
num = "";
//지금 누른 버튼이 연산자일 때의 조건
}else if (operation.equals("+")||operation.equals("-")||operation.equals("X")||operation.equals("/")) {
//첫 값을 음수로 입력할 수 있음
if (inputSpace.getText().equals("") && operation.equals("-")) {
inputSpace.setText(inputSpace.getText()+e.getActionCommand());
//이전에 누른 버튼이 연산자가 아니고 && 위의 계산식이 비어있지 않을 때의 조건문
}else if (!inputSpace.getText().equals("") && !prev_operation.equals("+")&&!prev_operation.equals("-") && !prev_operation.equals("X") && !prev_operation.equals("/")) {
inputSpace.setText(inputSpace.getText()+e.getActionCommand());
}
//나머지 버튼은 눌렀을 때 계산식에 추가됨
}else {
inputSpace.setText(inputSpace.getText() + e.getActionCommand());
}
//마지막으로 누른 버튼을 기억
prev_operation = e.getActionCommand();
}
}
private void fullTextParsing(String inputText) {
equation.clear();
//계산식의 글자를 하나하나 거쳐감
for (int i=0; i < inputText.length(); i++) {
char ch = inputText.charAt(i);
//연산기호가 나오면 ArrayList에 추가되고 초기화
if (ch=='-' || ch =='+' || ch=='X' || ch=='/') {
//연산기호를 만났다 == 앞은 숫자
//숫자를 ArrayList에 추가
equation.add(num);
//num 초기화
num ="";
//연산기호를 Array에 추가
equation.add(ch + "");
}else {
//나머지는 그냥 숫자 처리
num = num + ch;
}
}
//반복문 끝나고 남아있는 숫자값 추가
equation.add(num);
//연산자가 있을 때 num을 ArrayList에 추가하는데, 처음에 -가 있으면 ""가 추가되어 에러가 발생함
//""제거
equation.remove("");
}
//계산기능
public double calculate(String inputText) {
fullTextParsing(inputText);
//위의 메소드를 실행하면 ArrayList에 숫자와 연산 기호가 담김
double prev = 0;
double current = 0;
//연산 기호에 대한 처리를 위한 변수
String mode = "";
//+일 경우 add, -일 경우 sub, x의 경우 mul, /일 경우 div
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 {
//숫자일 경우 문자열을 Double로 형변환
current = Double.parseDouble(s);
//mode값에 따라 처리, prev는 계속 계산값이 갱신됨.
if (mode.equals("add")) {
prev += current;
}else if (mode.equals("sub")) {
prev -= current;
}else if (mode.equals("mul")) {
prev *= current;
}else if (mode.equals("div")) {
prev /= current;
}else {
prev = current;
}
}
// //소수점 여섯번 째 자리에서 반올림 -> 화면 표시 제한
// prev = Math.round(prev + 100000) / 100000.0;
}
//계산값 prev 반환
return prev;
}
public static void main(String[] args) {
new Calculator();
}
}
실행결과