note

Swing 으로 계산기 본문

자바/Swing

Swing 으로 계산기

투한 2011. 12. 30. 14:32
package com.swing;//Swing 계산기

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Calculation extends JFrame implements ActionListener{

	JButton button1, button2;
	JTextField text1,text2,text3;
	JComboBox combo;
	int num1 ,num2,res;
	String t1,t2,com;

	public Calculation(){

		super("==계 산 기==");

		Container contentPane = getContentPane();
		//프레임의 contentPane 객체를 얻어옴
		JPanel pane1 = new JPanel();
		JPanel pane2 = new JPanel();

		pane1.setLayout(new FlowLayout());
		text1 = new JTextField(5);
		text2 = new JTextField(5);
		text3 = new JTextField(5);

		String[] op = {"+","-","*","/"};
		combo = new JComboBox(op);

		pane1.add(text1);
		pane1.add(combo);
		pane1.add(text2);
		pane1.add(new JLabel("="));
		pane1.add(text3);
		pane2.setLayout(new FlowLayout());

		//합계가 보여지는 textfield에 입력불가
		text3.setEditable(false);

		button1= new JButton("확인");
		button2= new JButton("삭제");
		pane2.add(button1);
		pane2.add(button2);

		contentPane.add(pane1, BorderLayout.NORTH);
		contentPane.add(pane2, BorderLayout.CENTER);
		//x 버튼 종료 처리

		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		button1.addActionListener(this);
		button2.addActionListener(this);

		setLocation(500,400);
		pack();
		//사이즈를 명시하지 않을 경우 컴퍼넌트의 크기를 인식 자동으로 window 사이즈 변경
		setVisible(true);		
	}

	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		new Calculation();
	}
	public void actionPerformed(ActionEvent e){
		Object obj = e.getSource();//이벤트가 발생한 객체반환
		if(obj == button1){
			t1 = text1.getText().trim();//String으로 받아오면서 공백제거
			t2 = text2.getText().trim();
			com = (String)combo.getSelectedItem();


			//검증
			if(!isDigit(t1)){
				showErrMsg(text1,"숫자를 입력하시오");
				return;
			}else
				num1 = Integer.parseInt(t1);
			if(!isDigit(t2)){
				showErrMsg(text2,"숫자를 입력하시오");
				return;
			}else{
				num2 = Integer.parseInt(t2);
				doCalc();
			}
		}
		else{
			text1.setText("");
			text2.setText("");
			text3.setText("");
		}// end if (obj ==button1)
	}
	private void doCalc(){



		if(com.equals("/") && num2 ==0)
			showErrMsg(text2,"0으로 나눌 수 없습니다.");
		else{


			//charAt(0)
			switch(com.charAt(0)){
			case '+' : res =num1 + num2;break;
			case '-' : res =num1 - num2;break;
			case '*' : res =num1 * num2;break;
			case '/' : res =num1 / num2;break;
			}
			//String -> int 형변환 t1,t2 -> num1,num2
			//com -> String -> char : com.charAt(0)
			//switch문을 이용해서 결과를 res
			text3.setText(res+"");
		}
	}
	private boolean isDigit(String value){


		//1.value 루핑하면 숫자인지 문자인지 체크value.length();
		//2.48~57사이 value.charAt(i) - >char a
		//a -> (int)a 48~57
		//3.문자가 발견되면 for문을 빠져나와 return false;


		//음수 체크
		if(value.startsWith("-") && value.length()>1){
			value = value.substring(1);
		}
		
		//빈 문자열 처리
		if("".equals(value))return false;
		//문자 체크
		for(int i=0; i 57)
				return false;
		}
		return true;

		/*for(int i = 0; i 58){
				//해당 char값이 숫자가 아닐 경우
				return false;
			}
			else{
				return true;
			}
		}
	}*/
	}


	private void showErrMsg(JTextField txt, String str){
		txt.requestFocus();
		txt.setText("");
		text3.setText("");//에러 발생시 합계를 초기화
		JOptionPane.showMessageDialog(this,str,"이러시면 곤란합니다",JOptionPane.ERROR_MESSAGE);
		//부모 컴포넌트,메세지,메세지 타이틀,메세지 타입
	}

}