package FrameTest; import java.awt.Button; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.TextField; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.StringTokenizer; import java.util.Vector; import javax.naming.spi.DirStateFactory.Result; import javax.swing.JTextField; import FrameTest.CalProject.MyCalculators; public class Awtcalculation extends Frame implements ActionListener, KeyListener{ private boolean FirstArithmetic; // 첫번째에 사칙연산 삽입 금지 private String lastText; private String beforeChar = ""; // 사칙연산 연속 입력 방지 private String showText = ""; // 계산식 저장 private Vector arrayAwtcalculation = new Vector(50); // 사칙연산 저장하는 배열 private float lastValue; // = 후에 남은 값 저장 private int maxSize =0; private float result = 0; StringTokenizer st; JTextField Calresult; public Awtcalculation() { super("계산기 1본"); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints constraint = new GridBagConstraints(); constraint.fill = GridBagConstraints.BOTH; /** TextField Result */ constraint.gridwidth = 4; constraint.gridwidth = GridBagConstraints.REMAINDER; Calresult = new JTextField(""); Calresult.setHorizontalAlignment(JTextField.RIGHT); gridbag.setConstraints(Calresult, constraint); add(Calresult); /** Button */ constraint.gridwidth = 2; Button backBtn = new Button("←"); gridbag.setConstraints(backBtn, constraint); add(backBtn); backBtn.addActionListener(new ButtonListener()); constraint.gridwidth = GridBagConstraints.REMAINDER; Button clearBtn = new Button("C"); gridbag.setConstraints(clearBtn, constraint); add(clearBtn); clearBtn.addActionListener(new ButtonListener()); constraint.weightx = 1.0; constraint.gridwidth = 1; Button numSevenBtn = new Button("7"); gridbag.setConstraints(numSevenBtn, constraint); add(numSevenBtn); numSevenBtn.addActionListener(new ButtonListener()); Button numEightBtn = new Button("8"); gridbag.setConstraints(numEightBtn, constraint); add(numEightBtn); numEightBtn.addActionListener(new ButtonListener()); Button numNineBtn = new Button("9"); gridbag.setConstraints(numNineBtn, constraint); add(numNineBtn); numNineBtn.addActionListener(new ButtonListener()); constraint.gridwidth = GridBagConstraints.REMAINDER; constraint.weightx = 1.0; Button numDeivideBtn = new Button("/"); gridbag.setConstraints(numDeivideBtn, constraint); add(numDeivideBtn); numDeivideBtn.addActionListener(new ButtonListener()); constraint.gridwidth = 1; Button numFourBtn = new Button("4"); gridbag.setConstraints(numFourBtn, constraint); add(numFourBtn); numFourBtn.addActionListener(new ButtonListener()); Button numFiveBtn = new Button("5"); gridbag.setConstraints(numFiveBtn, constraint); add(numFiveBtn); numFiveBtn.addActionListener(new ButtonListener()); Button numSixBtn = new Button("6"); gridbag.setConstraints(numSixBtn, constraint); add(numSixBtn); numSixBtn.addActionListener(new ButtonListener()); constraint.gridwidth = constraint.REMAINDER; Button numMultplyBtn = new Button("*"); gridbag.setConstraints(numMultplyBtn, constraint); add(numMultplyBtn); numMultplyBtn.addActionListener(new ButtonListener()); constraint.gridwidth = 1; Button numOneBtn = new Button("1"); gridbag.setConstraints(numOneBtn, constraint); add(numOneBtn); numOneBtn.addActionListener(new ButtonListener()); Button numTwoBtn = new Button("2"); gridbag.setConstraints(numTwoBtn, constraint); add(numTwoBtn); numTwoBtn.addActionListener(new ButtonListener()); Button numThreeBtn = new Button("3"); gridbag.setConstraints(numThreeBtn, constraint); add(numThreeBtn); numThreeBtn.addActionListener(new ButtonListener()); constraint.gridwidth = constraint.REMAINDER; Button numMinusBtn = new Button("-"); gridbag.setConstraints(numMinusBtn, constraint); add(numMinusBtn); numMinusBtn.addActionListener(new ButtonListener()); constraint.gridwidth = 1; Button numZeroBtn = new Button("0"); gridbag.setConstraints(numZeroBtn, constraint); add(numZeroBtn); numZeroBtn.addActionListener(new ButtonListener()); Button numConBtn = new Button("."); gridbag.setConstraints(numConBtn, constraint); add(numConBtn); numConBtn.addActionListener(new ButtonListener()); Button numEqualsBtn = new Button("="); gridbag.setConstraints(numEqualsBtn, constraint); add(numEqualsBtn); numEqualsBtn.addActionListener(new ButtonListener()); Button numPlusBtn = new Button("+"); gridbag.setConstraints(numPlusBtn, constraint); add(numPlusBtn); numPlusBtn.addActionListener(new ButtonListener()); /** 프레임 닫기 이벤트 */ addWindowListener( new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } } ); /** Frame set */ Calresult.addKeyListener(new MyCalculators()); Calresult.requestFocus(); setLayout(gridbag); setLocation(700, 200); pack(); setVisible(true); } public class Action{ public void Calculation(String str){ System.out.println("str : " + str); if(str.contains("+") || str.contains("-") || str.contains("*") || str.contains("/")){ st = new StringTokenizer(str , "+-*/" , true); // true , +-*/ 포함해서 자르기 arrayAwtcalculation.clear(); // 벡터 배열 초기화 while(st.hasMoreTokens()){ arrayAwtcalculation.addElement(String.valueOf(st.nextToken())); // 토큰을 벡터에 삽입 } System.out.println(arrayAwtcalculation); result = 0; result += Float.parseFloat(arrayAwtcalculation.elementAt(0)); System.out.println(result); for(int z = 1; z < arrayAwtcalculation.size(); z++){ if(arrayAwtcalculation.elementAt(z).equals("+")){ result += Float.parseFloat(arrayAwtcalculation.elementAt(z+1)); } else if(arrayAwtcalculation.elementAt(z).equals("-")){ result -= Float.parseFloat(arrayAwtcalculation.elementAt(z+1)); } else if(arrayAwtcalculation.elementAt(z).equals("*")){ result *= Float.parseFloat(arrayAwtcalculation.elementAt(z+1)); } else if(arrayAwtcalculation.elementAt(z).equals("/")){ result /= Float.parseFloat(arrayAwtcalculation.elementAt(z+1)); } } Calresult.setText(String.valueOf(result)); }else{ ; } } } private class ButtonListener extends Action implements ActionListener{ public void actionPerformed(ActionEvent e){ e.getActionCommand(); // 시작이 사칙연산으로 시작되면 안됨. if(showText.isEmpty() || showText == "" || showText == null){ FirstArithmetic = false; }else{ FirstArithmetic = true; } /** 숫자 및 뒤로가기, 초기화 */ if(e.getActionCommand() == "C"){ beforeChar = ""; showText= ""; result =0; } else if(e.getActionCommand() == "←" && showText.length() >= 1){ showText = showText.substring(0,showText.length()-1); } else if(e.getActionCommand() == "0" || e.getActionCommand() == "1" || e.getActionCommand() == "2" || e.getActionCommand() == "3" || e.getActionCommand() == "4" || e.getActionCommand() == "5" || e.getActionCommand() == "6" || e.getActionCommand() == "7" || e.getActionCommand() == "8" || e.getActionCommand() == "9"){ showText += beforeChar = e.getActionCommand(); } /** 사칙연산 */ System.out.println(beforeChar); if ((e.getActionCommand() == "+" || e.getActionCommand() == "-" || e.getActionCommand() == "*" || e.getActionCommand() == "/" || e.getActionCommand() == ".") && FirstArithmetic){ if(!(beforeChar.equals("+") || beforeChar.equals("-") || beforeChar.equals("*") || beforeChar.equals("/") || beforeChar.equals("=") || beforeChar.equals("."))){ // 사칙연산 연속 두번 방지 beforeChar = ""; showText += beforeChar = e.getActionCommand(); } } System.out.println("쌓이는 값 : " + showText); Calresult.setText(showText); if (e.getActionCommand() == "="){ lastText = showText.substring(showText.length()-1); if(!e.getActionCommand().equals(beforeChar)){ if(lastText.equals("+") || lastText.equals("-") || lastText.equals("*") || lastText.equals("/") || lastText.equals(".")){ showText = showText.substring(0,showText.length()-1); } Calculation(showText); } } } } class MyCalculators extends Action implements KeyListener{ @Override public void keyTyped(KeyEvent e){} @Override public void keyPressed(KeyEvent e){ if(showText.length() == 0 || showText == " "){ FirstArithmetic = false; } else { FirstArithmetic = true; } System.out.println(e.getKeyCode()); if(e.getKeyCode() == KeyEvent.VK_0 || e.getKeyCode() == KeyEvent.VK_NUMPAD0){ showText+=0; beforeChar = "0"; } else if(e.getKeyCode() == KeyEvent.VK_1 || e.getKeyCode() == KeyEvent.VK_NUMPAD1){ showText+=1; beforeChar = "1"; } else if(e.getKeyCode() == KeyEvent.VK_2 || e.getKeyCode() == KeyEvent.VK_NUMPAD2){ showText+=2; beforeChar = "2"; } else if(e.getKeyCode() == KeyEvent.VK_3 || e.getKeyCode() == KeyEvent.VK_NUMPAD3){ showText+=3; beforeChar = "3"; } else if(e.getKeyCode() == KeyEvent.VK_4 || e.getKeyCode() == KeyEvent.VK_NUMPAD4){ showText+=4; beforeChar = "4"; } else if(e.getKeyCode() == KeyEvent.VK_5 || e.getKeyCode() == KeyEvent.VK_NUMPAD5){ showText+=5; beforeChar = "5"; } else if(e.getKeyCode() == KeyEvent.VK_6 || e.getKeyCode() == KeyEvent.VK_NUMPAD6){ showText+=6; beforeChar = "6"; } else if(e.getKeyCode() == KeyEvent.VK_7 || e.getKeyCode() == KeyEvent.VK_NUMPAD7){ showText+=7; beforeChar = "7"; } else if(e.getKeyCode() == KeyEvent.VK_8 || e.getKeyCode() == KeyEvent.VK_NUMPAD8){ showText+=8; beforeChar = "8"; } else if(e.getKeyCode() == KeyEvent.VK_9 || e.getKeyCode() == KeyEvent.VK_NUMPAD9){ showText+=9; beforeChar = "9"; } else if(e.getKeyCode() == KeyEvent.VK_BACK_SPACE && showText.length() >= 1){ showText = showText.substring(0,showText.length()-1); } else if(e.getKeyCode() == KeyEvent.VK_PLUS || e.getKeyCode() == KeyEvent.VK_PLUS + 46 || e.getKeyCode() == 107 && FirstArithmetic){ System.out.println("beforeChar : "+ beforeChar + "boolean : " + !beforeChar.equals("+")); beforeChar = ""; beforeChar = "+"; showText+="+"; } else if(e.getKeyCode() == KeyEvent.VK_MINUS || e.getKeyCode() == KeyEvent.VK_MINUS + 64 && FirstArithmetic){ if(!beforeChar.equals("-")){ // 사칙연산 연속 두번 방지 beforeChar = ""; beforeChar = "-"; showText+="-"; } } else if(e.getKeyCode() == KeyEvent.VK_DIVIDE || e.getKeyCode() == KeyEvent.VK_DIVIDE + 64 && FirstArithmetic){ if(!beforeChar.equals("/")){ // 사칙연산 연속 두번 방지 beforeChar = ""; beforeChar = "/"; showText+="/"; } } else if(e.getKeyCode() == KeyEvent.VK_MULTIPLY || e.getKeyCode() == KeyEvent.VK_MULTIPLY + 50 && FirstArithmetic){ if(!beforeChar.equals("*")){ // 사칙연산 연속 두번 방지 beforeChar = ""; beforeChar = "*"; showText+="*"; } } else if(e.getKeyCode() == KeyEvent.VK_COLON || e.getKeyCode() == KeyEvent.VK_COLON + 48 && FirstArithmetic){ if(!beforeChar.equals(".")){ // 사칙연산 연속 두번 방지 beforeChar = ""; beforeChar = "."; showText+="."; } } else if((e.getKeyCode() == KeyEvent.VK_EQUALS && !(e.getKeyCode() == KeyEvent.VK_PLUS)) || e.getKeyCode() == KeyEvent.VK_ENTER){ if(!beforeChar.equals("=")){ // 사칙연산 연속 두번 방지 lastText = showText.substring(showText.length()-1); if(lastText.equals("+") || lastText.equals("-") || lastText.equals("*") || lastText.equals("/") || lastText.equals(".")){ showText = showText.substring(0,showText.length()-1); } Calculation(showText); } } System.out.println(showText); } @Override public void keyReleased(KeyEvent e){ } } public static void main(String args[]){ new Awtcalculation(); } }