계산기

short·2019년 12월 12일
0

Java

목록 보기
2/2

계산기

package calcu;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.StringTokenizer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class calculaotr extends JFrame implements ActionListener{
	
	// 버튼이름배열, 텍스트필드 생성
	String[] str = {"CE", "계산", "+", "-", "x", "%"};
	JTextField tf1, tf2;
	String numStr="0";
	
	// 계산기 프레임
	public calculaotr() {
		setTitle("계산기");
		setSize(300, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container c = getContentPane();
		JPanel top = new JPanel();
		JPanel bottom = new JPanel();
		JPanel body = new JPanel();

		
		top.setBackground(Color.LIGHT_GRAY);
		bottom.setBackground(Color.LIGHT_GRAY);
		body.setLayout(new GridLayout(4, 4, 5, 5));

		JLabel label1 = new JLabel("수식입력");
		tf1 = new JTextField(15);
		tf1.setText(numStr);
		top.add(label1);
		top.add(tf1);

		JLabel label2 = new JLabel("계산결과");
		tf2 = new JTextField(15);
		bottom.add(label2);
		bottom.add(tf2);

		for (int i = 0; i < 16; i++) {
			JButton b = new JButton();
			if (i < 10) {
				b.setText(i + ""); 
				b.setBackground(Color.WHITE); // 숫자버튼
			} else {
				b.setText(str[i - 10]); // CE, 계산 버튼
				b.setBackground(Color.WHITE);
			}
			if (i > 11)
				b.setBackground(Color.WHITE); // 사칙연산기호 버튼
			
			body.add(b);
			b.addActionListener(this);
		}
		c.add(body);
		c.add(top, BorderLayout.NORTH);
		c.add(bottom, BorderLayout.SOUTH);
		setVisible(true);
	}

	
	// 버튼 이벤트 리스너
	@Override
	public void actionPerformed(ActionEvent e) {
		String str = e.getActionCommand();
			
		 // 초기화버튼
		if(str.equals("CE")) {
			numStr = "0";
			tf1.setText("0");
			tf2.setText("");
		}
		
		// 계산 버튼
		else if(str.equals("계산")) { 
			// 입력값 파싱. 입력된값을 연산자를 기준으로 슬라이싱하고 구분자도 토큰으로 간주한다.
			StringTokenizer st = new StringTokenizer(numStr, "+-x%", true); 
			ArrayList<String> result = new ArrayList<String>();
			int lang = st.countTokens();
			
			for(int i=0; i < lang; i++) {
				result.add(st.nextToken());
			}

			// 곱셈, 나눗셈 계산
			for(int i=1; i<lang; i+=2) {
				if(result.get(i).equals("x")) {
					int x = Integer.parseInt(result.get(i-1))*Integer.parseInt(result.get(i+1));
					result.remove(i-1);
					result.add((i-1),x+"");
					result.remove(i);
					result.remove(i);
					i -= 2;
					lang = result.size();
				}else if(result.get(i).equals("%")) {
					int x = Integer.parseInt(result.get(i-1))*Integer.parseInt(result.get(i+1));
					result.remove(i-1);
					result.add((i-1),x+"");
					result.remove(i);
					result.remove(i);
					i -= 2;
					lang = result.size();
				}
			}
			
			// 덧셈, 뺄셈 계산
			for(int i=1; i<result.size(); i+=2) {
				if(result.get(i).equals("+")) {
					int x = Integer.parseInt(result.get(i-1))+Integer.parseInt(result.get(i+1));
					result.remove(i-1);
					result.add((i-1),x+"");
					result.remove(i);
					result.remove(i);
					i -= 2;
					lang = result.size();
				}else if(result.get(i).equals("-")) {
					int x = Integer.parseInt(result.get(i-1))-Integer.parseInt(result.get(i+1));
					result.remove(i-1);
					result.add((i-1),x+"");
					result.remove(i);
					result.remove(i);
					i -= 2;
					lang = result.size();
				}
			}
			tf2.setText(result.get(0));			
			numStr="0";
			tf1.setText(numStr);
		}else {  // 연산,숫자 버튼 
			// 0일경우
				if(numStr.equals("0") || numStr.equals("0x") || numStr.equals("0-") || numStr.equals("0+") || numStr.equals("0%")) {
					if(str.equals("+")) { numStr="0+"; tf1.setText(numStr);}
					else if(str.equals("-")) { numStr="0-"; tf1.setText(numStr);}
					else if(str.equals("x")) { numStr="0x"; tf1.setText(numStr);}
					else if(str.equals("%")) { numStr="0%"; tf1.setText(numStr);}
					else { // 숫자입력
						if(numStr.equals("0")) numStr = "";
						numStr+=str;
						tf1.setText(numStr);
					}
				}else { // 숫자입력
				numStr+=str;
				tf1.setText(numStr);
				}
			}
		}
	// 메인
	public static void main(String[] args) {
		new calculaotr();
	}
}
profile
Java, JS, HTML, CSS, C++, Spring, JSP, Reactjs

0개의 댓글