package com.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, button3;
JTextField text1, text2, text3;
JComboBox combo;
int num1, num2, res;
String t1, t2, com;
public Calculation(){
super("계산 프로그램");
//getContentPane()는 JFrame에있는것
Container contentPane=getContentPane();
//프래임의 contentPane 객체를 얻어옴
JPanel pane1 = new JPanel(); //판넬로 묶어줌
JPanel pane2 = new JPanel();
pane1.setLayout(new FlowLayout()); //한줄로 정렬
text1 =new JTextField(5); //5 = int columns
text2 =new JTextField(5);
text3 =new JTextField(5);
String[] op = {"+","-","*","/"};
combo = new JComboBox(op);
//판넬1에 텍스트필드 콤보박스 등록
pane1.add(text1);
pane1.add(combo);
pane1.add(text2);
pane1.add(new JLabel("="));
pane1.add(text3);
//합계가 보여지는 textfield에 입력불가
text3.setEditable(false);
button1 = new JButton("확인");
button2 = new JButton("취소");
button3 = new JButton("종료");
//판넬에 버튼등록
pane2.add(button1);
pane2.add(button2);
pane2.add(button3);
//컨테이너에 판넬 등록
contentPane.add(pane1, BorderLayout.NORTH);
contentPane.add(pane2, BorderLayout.CENTER);
//X 버튼 종료 처리
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button1.addActionListener(this);
button2.addActionListener(this);
button3.addActionListener(this);
setLocation(500,400);
//pack() :사이즈를 명시하지 않을 경우 컴퍼넌트의 크기를 인식 자동으로 Window 사이즈 변경
pack();
setVisible(true);
}
public static void main(String[] args){
JFrame.setDefaultLookAndFeelDecorated(true);
new Calculation();
}
public void actionPerformed(ActionEvent e){
//getSource() : 이벤트가 발생한 객체를 반환
Object obj=e.getSource();
if(obj == button1){
//getText().trim() : 공백은 제거해서 String 으로 받음
t1 = text1.getText().trim();
t2 = text2.getText().trim();
//getSelectedItem() : 선택한 값을 가져옴
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 if(obj == button2){
text1.setText("");
text2.setText("");
text3.setText("");
}
else if(obj == button3){
dispose();
System.exit(0);
}//end if (obj == button1)
}
private void doCalc(){
if(com.equals("/") && num2 ==0){
showErrMsg(text2,"0으로 나눌 수 없습니다.");
}else{
switch(com.charAt(0)){ //switch 시작을 알리는 중괄호를 반드시 적어주어야함
case '+' : res = num1 + num2 ;break;
case '-' : res = num1 - num2 ;break;
case '*' : res = num1 * num2 ;break;
case '/' : res = num1 / num2 ;break;
}
}
text3.setText(res+"");
}
//전달되는 데이터가 숫자면 true 숫자가 아니면 false
//오류체크메소드
private boolean isDigit(String value){
//1.value 루핑하면 숫자 문자 체크 for문 valuse.length()
//2.아스키코드 48~57 = 0~9
// 48 <= value.charAt(i)<=57 ->char a
// a -> (int)a 48~57
//3.문자가 발견되면 for를 빠져나와서 return flase
//음수 처리 //substring 으로 - 기호 제거하고 체크돌림
if(value.startsWith("-")&& value.length()>1){
value = value.substring(1);
}
//빈문자열처리
if("".equals(value)) return false;
//문자체크
for(int i=0; i=<value.length(); i++){
char result = value.charAt(i);
if((int)result < 48 || (int)result > 57 ) return false;
}
return true;
}
private void showErrMsg(JTextField txt, String str){
txt.requestFocus();
txt.setText("");
text3.setText(""); //에러 발생시 합계를 초기화
JOptionPane.showMessageDialog(this, str,"에러 메시지",JOptionPane.ERROR_MESSAGE);
//부모 컴포넌트 , 메세지,메세지 타이틀, 메세지 타입
}
}