CAFE

◆ 자바기본 Q&A

[[질문]]이소스 부분 별로 설명 좀 해주세요^^*

작성자한성순|작성시간05.08.23|조회수33 목록 댓글 0

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;

class QuestionThree extends Frame implements ActionListener, KeyListener
{
 final int  PREV_PUSH_NUMBER = 0;    
 final int PREV_PUSH_OPERATOR = 1;
 final int  PREV_PUSH_EQUAL = 2;

 JTextField resultBox, memoryState; // 결과창과 메모리상태창
 Button[] calcButton;  

 boolean  isBelowZero;  // 현재 소수점 밑인지 아닌지 플래그
 double  number, result;  // 연산에 쓰이는 두 변수
 double   memory;    // 메모리 변수
 int   zeroLocation;  // 소숫점이 찍힌 자리수
 char  preOperator;  // 이전에 누른 연산자 버퍼

 int   checkStatus;  // 이전에 무엇을 수행했는지 기억하는 변수

 final Color BACKGROUND = new Color( 192, 192, 192 );
 
 public QuestionThree( String title )
 {
  super( title );

  setSize( 300, 200 );
  setBackground( BACKGROUND );
  setLayout( new BorderLayout() );

  resultBox = new JTextField( "0." );
  resultBox.setHorizontalAlignment( JTextField.RIGHT );
  resultBox.setEnabled( false );
  resultBox.addKeyListener( this );
  add( resultBox, BorderLayout.NORTH );

  memoryState = new JTextField();
  memoryState.setEnabled( false );
  memoryState.setFont( new Font( "Dialog", Font.BOLD, 20 ) );
  memoryState.setHorizontalAlignment( JTextField.CENTER ); // 정렬상태
    
  calcButton = new Button[24];
  for (int i=0; i<24 ; i++)
  {
   calcButton[i] = new Button();
   calcButton[i].setFont( new Font( "Dialog", Font.PLAIN, 14 ) );
   calcButton[i].addActionListener( this );
   calcButton[i].addKeyListener( this );
  }
  calcButton[0].setLabel( "Back" );
  calcButton[1].setLabel( "CE" );
  calcButton[2].setLabel( "C" );
  calcButton[3].setLabel( "=" );
  calcButton[4].setLabel( "MC" );
  calcButton[5].setLabel( "7" );
  calcButton[6].setLabel( "8" );
  calcButton[7].setLabel( "9" );
  calcButton[8].setLabel( "/" );
  calcButton[9].setLabel( "MR" );
  calcButton[10].setLabel( "4" );
  calcButton[11].setLabel( "5" );
  calcButton[12].setLabel( "6" );
  calcButton[13].setLabel( "*" );
  calcButton[14].setLabel( "MS" );
  calcButton[15].setLabel( "1" );
  calcButton[16].setLabel( "2" );
  calcButton[17].setLabel( "3" );
  calcButton[18].setLabel( "-" );
  calcButton[19].setLabel( "M+" );
  calcButton[20].setLabel( "0" );
  calcButton[21].setLabel( "+/-" );
  calcButton[22].setLabel( "." );
  calcButton[23].setLabel( "+" );

  addKeyListener( this );

  Panel p = new Panel();
  p.setLayout( new GridLayout( 5, 5, 5, 5 ) );
  p.addKeyListener( this );
  p.add( memoryState );
  for ( int i=0; i<24; i++)
  {
   p.add( calcButton[i] );
  }
  add( p, BorderLayout.CENTER );

  addWindowListener( new windowAdapter() );

  buttonC(); // 계산기 시작할때 자동으로 C버튼을 눌러 초기화
  calcButton[2].requestFocus();
 }

 class windowAdapter extends WindowAdapter
 {
  public void windowClosing( WindowEvent e )
  {
   System.exit(0);
  }
 };

 public void keyPressed( KeyEvent e ) {}
 public void keyReleased( KeyEvent e ) {}
 public void keyTyped( KeyEvent e )
 {   
  int pushKey = (int)e.getKeyChar();
  char pushChar = e.getKeyChar();

  if (pushKey>=0x30 && pushKey<=0x39)
  {
   buttonNumber( pushKey-0x30 );
  }
  else
  {
  switch (pushChar)
  {
   case '+':
    calculate( "+" );
    break;
   case '-':
    calculate( "-" );
    break;
   case '*':
    calculate( "*" );
    break;
   case '/':
    calculate( "/" );
    break;
   case '\n':
   case '=':
    calculate( "=" );
    break;
   case '.': // .
    isBelowZero = true;
    break;
   case 'C':
   case 'c':
    buttonC();
    break;
   }
  }
 }   
 
 public void buttonNumber( int pushNumber )
 {  
  // 이전에 숫자를 누르지 않았다면 창을 지워준다.
  switch (checkStatus)
  {
   case PREV_PUSH_OPERATOR:
    buttonCE(); 
    break; 
   case PREV_PUSH_EQUAL:
    buttonC();
    break;
  }

  String prevString = resultBox.getText();
  
  if (isBelowZero)
   resultBox.setText( prevString + String.valueOf(pushNumber) );
  else
  {
   if (prevString.charAt(0)=='0')
   {
    resultBox.setText(
     String.valueOf( pushNumber ) +
     prevString.substring( 1 )
    );
   }   
   else
   {
    String before = prevString.substring( 0, zeroLocation );
    String after = prevString.substring( zeroLocation );
    
    resultBox.setText( before + String.valueOf( pushNumber ) +
     after );

    zeroLocation++;
   }
  }
  checkStatus = PREV_PUSH_NUMBER;
 }

 public void calculate( String strPushOperator )
 {
  char pushOperator = strPushOperator.charAt(0);
  number = Double.parseDouble( resultBox.getText() );

  switch (preOperator)
  { 
  case '+':
   result += number;
   break;
  case '-':
   result -= number;
   break;
  case '*':
   result *= number;
   break;
  case '/':
   result /= number;
   break;
  default:
   result = number;   
   break;
  }
  String resultText = String.valueOf( result );
  
  // 결과 출력시 끝이 .0이면 마지막 0을 지워준다.
  if ((resultText.length()-2)==resultText.indexOf( "." ))
  {   
   if (resultText.charAt( resultText.length()-1 )=='0')
   {   
    resultText = resultText.substring( 0, resultText.length()-1 );
   }
  }
   
  resultBox.setText( resultText );   

  preOperator = pushOperator;

  if (pushOperator=='=')
   checkStatus = PREV_PUSH_EQUAL;
  else
   checkStatus = PREV_PUSH_OPERATOR;
 }

 public void buttonC()
 { 
  isBelowZero = false;
  number = 0;
  result = 0;
  preOperator = ' ';   
  zeroLocation = 1;
  resultBox.setText( "0." );
  checkStatus = PREV_PUSH_NUMBER;
 }

 public void buttonCE()
 {
  resultBox.setText( "0." );
  isBelowZero = false;
  zeroLocation = 1;  
 }

 public void memoryProcess( char delimeter )
 {
  switch (delimeter)
  {
   case 'S':
    memory = Double.parseDouble( resultBox.getText() );
    memoryState.setText( "M" );
    break;
   case 'R':
    resultBox.setText( String.valueOf( memory ) );
    String resultText = resultBox.getText();
    if ((resultText.length()-2)==resultText.indexOf( "." ))
    {   
     if (resultText.charAt( resultText.length()-1 )=='0')
     {   
      resultBox.setText( resultText.substring( 0, resultText.length()-1 ) );
     }
    }
    break;
   case 'C':
    memory = 0;
    memoryState.setText( "" );
    break;
   case '+':
    memory += Double.parseDouble( resultBox.getText() );
    memoryState.setText( "M" );
    break;
  }   
    
 }

 public void backSpace()
 {
  String resultText = resultBox.getText();
 
  // Backspace는 이전에 숫자가 눌렀을 경우만 가능하게 해야 한다.
  if (checkStatus==PREV_PUSH_NUMBER)
  {
   if (isBelowZero) // 소숫점 이하가 표기되어있을 경우
   {
    int len = resultText.length();
    
    resultText = resultText.substring( 0, len-1 );
    resultBox.setText( resultText );
  
    if (resultText.charAt( len-2 )=='.')    
     isBelowZero = false;
   }
   else // 소숫점이하가 표기되어있지 않을 경우
   {
    int len = resultText.length();

    resultText = resultText.substring( 0, len-2 ) + ".";
    zeroLocation--;
    resultBox.setText( resultText );    
   }    

   if (resultText.length()==1)
   {
    buttonCE();
   }
  }
 }

 public void changeAbs()
 {
  String resultText = resultBox.getText();

  if (checkStatus==PREV_PUSH_NUMBER)
  {
   if (resultText.charAt(0)=='-')
   {
    resultText = resultText.substring( 1 );
   }
   else
   {
    resultText = "-" + resultText;
   }
  
   resultBox.setText( resultText );
  }
 }

 public void actionPerformed( ActionEvent e )
 {
  String targetLabel = ((Button)e.getSource()).getLabel();
  
  try {
   if ( Integer.parseInt( targetLabel ) > 0 || targetLabel.equals( "0" ) )
   {
    buttonNumber( Integer.parseInt( targetLabel ) );
    return;
   } 
  } catch( NumberFormatException ne ) {};

  if (targetLabel.equals( "CE" ))
   buttonCE();

  if (targetLabel.equals( "C" ))
   buttonC();

  if (targetLabel.equals( "." ))
   isBelowZero = true;

  if (targetLabel.equals( "+" ) || targetLabel.equals( "-" ) ||
   targetLabel.equals( "*" ) || targetLabel.equals( "/" ) ||
   targetLabel.equals( "=" ) )  
   calculate( targetLabel );
  
  if (targetLabel.charAt(0) == 'M')
   memoryProcess( targetLabel.charAt(1) );

  if (targetLabel.charAt(0) == 'B') // Backspace button
   backSpace();

  if (targetLabel.equals("+/-"))
   changeAbs();

 }
 
 public static void main(String[] args)
 {
  QuestionThree qt = new QuestionThree( "Question Three" );
  qt.show();
 }
}

다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
맨위로

카페 검색

카페 검색어 입력폼