[JAVA]GUI 계산기 만들었읍니다

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Calculator extends JFrame{
	
	private JTextField tf1;
	private JTextField tf2;
	private String tempString = "";
	private String op;
	private int tempNum1 = 0;
	private int tempNum2 = 0;
	private int result;
	
	public Calculator() {
		setTitle("계산기 프레임");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new BorderLayout());
		
		JPanel Panel_North = new JPanel();
		JPanel Panel_Center = new JPanel();
		JPanel Panel_South = new JPanel();
		
		JLabel text1 = new JLabel("수식입력");
		tf1 = new JTextField(15);
		JLabel text2 = new JLabel("계산 결과");
		tf2 = new JTextField(16);
		
		Panel_North.setBackground(Color.lightGray);
		Panel_Center.setBackground(Color.white);
		Panel_Center.setLayout(new GridLayout(4, 4, 5, 5));
		Panel_South.setBackground(Color.yellow);
		
		Panel_North.add(text1);
		Panel_North.add(tf1);
		Panel_South.add(text2);
		Panel_South.add(tf2);
		
		for(int i=0; i<16; i++) {
			JButton b = new JButton();
			b.addActionListener(new MyAction());
			String[] str = {"CE", "=", "+", "-", "*", "/"};
			Panel_Center.add(b);
			if(i<10)
				b.setText(Integer.toString(i));
			else
				b.setText(str[i-10]);
			if(i>11) {
				b.setOpaque(true);
				b.setBackground(Color.cyan);
			}
		}
		
		c.add(Panel_North, BorderLayout.NORTH);
		c.add(Panel_Center, BorderLayout.CENTER);
		c.add(Panel_South, BorderLayout.SOUTH);
		
		this.setSize(300, 300);
		this.setVisible(true);
	}
	
	class MyAction implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton)e.getSource();
			tempString = tf1.getText();
			
			if (tempString.equals("0")) {
				tempString = "";
			}
			
			switch(b.getText()) {
			case "0":
				int temp = 0;
				if (tempString != "")
					tf1.setText(tempString + "0");
				break;
			case "1":
				temp = 1;
				if(tempString != "") {
					tf1.setText(tempString + "1");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "2":
				temp = 2;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "2");
				} else {
					tf1.setText(Integer.toString(temp));				
				}
				break;
			case "3":
				temp = 3;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "3");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "4":
				temp = 4;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "4");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "5":
				temp = 5;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "5");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "6":
				temp = 6;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "6");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "7":
				temp = 7;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "7");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "8":
				temp = 8;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "8");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "9":
				temp = 9;
				if(tf1.getText() != "") {
					tf1.setText(tempString + "9");
				} else {
					tf1.setText(Integer.toString(temp));					
				}
				break;
			case "CE":
				tf1.setText("");
				tf2.setText("");
				break;
			case "+":
				tempNum1 = Integer.parseInt(tempString);
				op = "+";
				tf1.setText("");
				break;
			case "-":
				tempNum1 = Integer.parseInt(tempString);
				op = "-";
				tf1.setText("");
				break;
			case "*":
				tempNum1 = Integer.parseInt(tempString);
				op = "*";
				tf1.setText("");
				break;
			case "/":
				tempNum1 = Integer.parseInt(tempString);
				op = "/";
				tf1.setText("");
				break;
			case "=":
				tempNum2 = Integer.parseInt(tempString);
				if(op == "+")
					result = tempNum1 + tempNum2;
				if(op == "-")
					result = tempNum1 - tempNum2;
				if(op == "*")
					result = tempNum1 * tempNum2;
				if(op == "/")
					result = tempNum1 / tempNum2;
				tf2.setText(Integer.toString(result));
			}
			
		}
		
	}
	
	public static void main(String[] args) {
		new Calculator();
	}
	
}

학교 과제로 한 것인데 처음 봤을땐 에이 금방 하겠지 했는데 깨진건 제 머리였읍니다.
제가 못하는 것도 한몫하겠지만 너무 어려웠습니다… 이거 만드는데 하루를 다 날리다니;

특히 TextField(tf1)에서 첫 숫자가 0이 들어오면 안되는데 이게 자꾸 안 없어지니까 컴퓨터를 부셔버리고 싶더라구요 ㅎㅎ;

어쨌든 해결은 했읍니다. 잘 돌아가니까 보기 좋더라구요.
이 계산기 코드가 너무 긴 것 같아서 나중에 코드 좀 줄일려고 해봐야겠습니다.
언젠가는 공학용 계산기나 프로그래머용 계산기 같은것도 만들어 보고 싶네요.

머리 아프고 스트레스 받긴 하는데 재밌었읍니다.

5 Likes

저도 요번에 학교에서 안드로이드로 윈도우 계산기랑 똑같이 만들기 했는데…
코드를 짤수록 개판이 되가는것이 좀 자괴감 들더라구요

지금 저가 배우는 건 원숭이도 책 한번 읽으면 할 수 있는 거라는 것을 다시 느끼네요 감사합니다

아 학교가기 싫다

원래 그러면서 크는거임

1 Like

어디서 코드 잘 짜는법좀 배울 수 있으면 좋겠어요…
그나마 요번에 짜면서 느낀건 대상을 분석하는 과정이 확실히 필요하다는걸 느꼈습니다

응. 난 그걸 '물성 해석’이라고 불러왔지.

한 번에 멋져지려고 하면 잘 안돼.
진행중인 프로젝트에 여러 파라다임을 바로 적용하면 프로젝트가 산으로가기 쉽지.
작게 작게 예제코드 수준으로 짜면서 다듬어야지.

근데 너무 잘짜려고 하면 프로그래밍 못한다.
완성이 먼저고 완벽은 나중 문제지.

똥을 줄기차게 싸는것도 능력이야.
중국 인도 베트남봐 인구도 자원이거든. 세계 시장에 노동력 제공하면서
꾸역 꾸역 수단과 방법을 가리지 않고 기술을 훔쳤던게 이제 미국도 넘보잖아.

1 Like