Java/Swing
swing을 이용한 계산기 ( 오류체크 try catch 로 바꿔보기)
Bohemian life
2012. 4. 13. 22:24
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); //부모 컴포넌트 , 메세지,메세지 타이틀, 메세지 타입 } }