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);
  //부모 컴포넌트 , 메세지,메세지 타이틀, 메세지 타입

 }
}


'Java > Swing' 카테고리의 다른 글

예비  (0) 2012.04.13
Swing 으로 계산기  (0) 2012.04.13

+ Recent posts