eclipse swt로 간단한 계산기 만들기(2)

 

지난번에 만든 GUI 화면을 가지고 샘플 코드를 작성해보도록 하겠습니다.

 

초보를 위한 내용이라서 코드가 좋은 코드라고 말할 수 없습니다.

어느정도 자바 특성을 이해하고 흐름을 보기 위해서 작성하는 거라 보기엔 더 편할 거 같습니다.

 

버튼의 입력을 받아서 계산을 해보도록 하겠습니다.

 

1. 화면

 

지난 주에 만들었던 계산기 화면입니다.

 

 

 

2. 준비

 

먼저, 지난 소스 코드에서 수정할 부분이 있습니다.

 

먼저 파란색으로 표시된 부분을 보면...

각 함수에 들어가 있던 변수를 클래스에서 선언하도록 위쪽으로 뺏습니다.

각 변수들은 별다른 선언을 하지 않아도 private 속성을 가집니다.

 

현재 클래스의 모든 함수들이 아래 변수를 사용할 수 있습니다.

 

 

그리고 녹색으로 표시된 부분을 보면...
추가적으로 계산기의 입력을 받기 위해서 입력 값, 결과 값, 사칙연산 3개를 받도록 하겠습니다.

 

public class hello {

    static  Display display;
    static  Shell shell;
    static  Text    txtResult;                              // 이미지 버튼
    static  Button  btnNumber[];                            // 0~9 숫자
    static  Button  btnSum, btnMinus, btnMulti, btnDiv;     // 차례대로 +, -, x, /
    static  Button  btnEqual, btnClear, btnDot;             // 차례대로 =, clear, .


    static  String  input_number;                           // 입력 값
    static  int     result_number;                          // 결과 값
    static  String  calc_operation;                        // 사칙연산


    /**
     * 메인 함수이다.
     * @param args
     */
    public static void main(String[] args) {
        
        (생략)
        
        createView(shell);
  
        (생략)
        display.dispose();
    }
    

 

그 다음 버튼 입력을 받기 위해서 actionButton 함수를 만들어 줍니다.

 

(생략)

        createView(shell);
        actionButton();

 (생략)

 

GUI 화면을 끝냈으니, 다음엔 버튼을 클릭해서 값을 주고 받는 것을 써봐야겠습니다. ㅎㅎ

 

 

3. 숫자 입력

 

이제부터 actionButton 함수에서 작성해나가도록 하겠습니다.

 

예전에 버튼 입력을 하기 위해서 addListener를 사용한 적이 있습니다.

 

아래와 같이 입력을 했었습니다.

 

btnNumber[0].addListener(SWT.Selection, new Listener() {
});

 

 

이제 키를 눌렀을 때, 숫자가 입력하도록 해야합니다.

 

결과가 나올 부분에 setText를 통해서 입력을 합니다.

문자를 넣는 것이기 때문에 큰 따옴표로 집어넣어줍니다.

 

btnNumber[0].addListener(SWT.Selection, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    // TODO Auto-generated method stub
                    
                    txtResult.setText("0");
                }

});

 

위와 같이 하면 0 이라는 문자 1개만 입력이 됩니다.

숫자를 이어서 입력되게 하려면 아래와 같이 합니다.

 

우리는 먼저 입력 문자를 받기 위해서 String input_number 라는 변수를 만들었습니다.

거기에 집어 넣고 출력하도록 하겠습니다.

 

btnNumber[0].addListener(SWT.Selection, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    // TODO Auto-generated method stub
                    
                    input_number += "0";
                    
                    txtResult.setText(input_number);

                }

});

 

위의 예제에서와 같이 "0"을 입력한 후에 "0"을 또 입력하면 "0" + "0" = "00" 으로 표시가 됩니다.

문자열이니까 그대로 이어서 붙어오는 것입니다.

 

또 한가지 생각해 볼 것이 있습니다.

계산기에서 숫자 표현상 123 또는 3000 은 제대로 된 표현입니다.

하지만, 0123 과 같이 앞에 0이 붙는다면 좀 이상하게 보입니다.

 

이것을 수정하기 위해서 문자열 길이가 0 또는 1보다 적을 경우 "0" 이 앞부분에 나오기 않게 할 수 있습니다.

그렇지만 아래서 추천하는 부분은 형식 변환을 통해서 더 간단하게 변경할 수 있습니다.

 

예를 들어 "0123"을 숫자로 변경하면 123 으로 인식하게 됩니다. 이것을 다시 문자로 저장하면 되는 것입니다.

 

아래와 같이 문자열 값을 Interger.parseInt 로 감싸줍니다.

이것은 괄호 () 안에 문자를 숫자로 변경해주는 역할을 합니다.

 

btnNumber[0].addListener(SWT.Selection, new Listener() {

                @Override
                public void handleEvent(Event event) {
                    // TODO Auto-generated method stub
                    
                    input_number += "0";
                    
                    int tmp = Integer.parseInt("0");
                    
                    txtResult.setText(tmp + "");

                }

});

 

위와 같이 만들었다면, 모든 버튼을 동일한 내용으로 추가하도록 합니다.

 

addListner를 별도로 생성해서 적용할 수도 있지만, 여기선 누구나 할 수 있는 for 문을 쓰겠습니다.

 

int length = btnNumber.length;
        
for (int i = 0; i < length; i++) {
    final int number = i;
    btnNumber[i].addListener(SWT.Selection, new Listener() {

        @Override
        public void handleEvent(Event event) {
            // TODO Auto-generated method stub
           
           input_number += number;
           int tmp = Integer.parseInt(input_number);
           txtResult.setText(tmp + "");
        }
                
     });
}

 

이제 다시 한번 실행을 해서 숫자가 입력되는지 확인해봅니다.

 

 

 

4. 텍스트 폰트 크기

 

위의 그림에 보면 텍스트 부분에 폰트가 크게 적용된 것을 볼 수 있습니다.

 

생성 부분에서 아래와 같이 setFont에서 new Font를 생성해서 적용해주면 됩니다.

 

new Font 에 입력하는 내용은 아래와 같습니다.

 

new Font(device, name, height, style)

 

device : 출력되는 영역을 나타냅니다. 보통은 Display를 사용합니다.

name : 폰트 이름입니다. (영문명으로 써주세요)

height : 폰트 크기입니다.

style : 굵게, 이탤릭 등 폰트의 스타일을 정해줍니다. 특별히 정하지 않을 경우 SWT.NONE을 해주면 됩니다.

 

txtResult = new Text(comp, SWT.BORDER|SWT.RIGHT);
txtResult.setLayoutData(gridData);

txtResult.setFont( new Font(display, "Arial", 24, SWT.BOLD) );

 

 

5. 수식 입력

 

먼저 윈도우 계산기를 살펴보았습니다.

 

예를 들어 100 + 200을 입력한다고 할 때, 100 입력 후에 "+" 를 누르고 200을 입력하면, 기존의 100이 사라지고 200만 입력되었습니다. 그 후에 "="을 눌렀을 때, 300 이라는 값이 출력되었습니다.

 

수식을 입력하기 전에 값을 input_number 라고 정하고

나중에 "="을 눌렀을 때, 출력되는 값을 result_number 라고 정하였습니다.

 

static  String  input_number;                           // 입력 값
static  int     result_number;                          // 결과 값
static  String  calc_operation;                        // 사칙연산

 

사칙연산 중 덧셈을 먼저 해보도록 하겠습니다.

 

btnSum.addListener(SWT.Selection, new Listener() {

});

 

덧셈을 할 때, 규칙을 먼저 정해야 합니다.

 

현재 입력된 값이 있을 때, 그 값을 다른 곳에 저장하고 다음 값을 받기 위해 "0" 으로 표시를 해줘야합니다.

그러기 위해선 결과 값을 출력을 하지 않지만, 기존의 값을 넣어줍니다.

 

result_number += Integer.parseInt(input_number);

 

그리고 현재 값을 0으로 변경해 줍니다.

 

input_number = "0";

 

그 다음 현재 값을 텍스트란에 출력하도록 합니다.

 

txtResult.setText(input_number);

 

아참, 나중에 "="을 할 때, 어떤 기호가 눌렸는지 알기 위해서 "+" 입력을 저장해둡니다.

 

calc_operation = "+";

 

 

위와 같이 작성해서 만든 코드가 아래와 같습니다.

 

btnSum.addListener(SWT.Selection, new Listener() {

    @Override
    public void handleEvent(Event event) {
        // TODO Auto-generated method stub
        
        result_number += Integer.parseInt(input_number);
        input_number = "0";
        
        calc_operation = "+";
        
        txtResult.setText(input_number);
        
    }
    
});

 

더 쉬운 코드가 있겠지만, 흐름을 생각하는 의미로 보시면 됩니다.

 

 

이번엔 "="을 입력했을 때, 차례입니다.

 

btnEqual.addListener(SWT.Selection, new Listener() {
});

 

위의 "+" 와 같이 별로 다르지 않습니다.

현재 저장되어 있는 값과 지금 입력하고 있는 값을 가지고 사칙연산을 구분해서 계산해 주고 출력을 해주는 형식입니다.

 

btnEqual.addListener(SWT.Selection, new Listener() {

    @Override
    public void handleEvent(Event event) {
        // TODO Auto-generated method stub

        if (calc_operation == "+") {
            result_number += Integer.parseInt(input_number);
            input_number = "0";
        }

        txtResult.setText(result_number + "");
        
    }
    
});

 

위와 같이 작성 후 실행을 해봅니다.

 

 

6. 계산해보기

 

샘플로 급하게 만들어그런지 다듬어 지진 않았지만, 계산기의 기본 형태는 갖추었습니다.

 

 

위의 코드 조금 더 발전 시켜보면서 연습해 나가는게 좋을 거 같습니다.

 

 

권한

 

강좌에 대한 내용은 에프에이리눅스(주) 에 권한이 있습니다.
본문의 이미지 및 내용은 순수 제작한 것이며, 내용 중 외부 이미지를 사용할 경우, 출처를 표기합니다.
무분별한 불펌 보다는 포럼을 홍보해주셔서 더욱 더 활성화되어 좋은 내용의 글이 올라오도록 부탁드립니다.