본문 바로가기
Computer/Jlet

[16] 컴포넌트 - (6)DialogComponent

by DogBull 2006. 8. 12.

휴대폰을 사용하여 문자를 보내려고 할 때 문자 메세지를 작성하고 전화번호를 입력한 후 전송 버튼을 눌러 전송을 한다고 해 보자. 그때 <전송중입니다>라는 창이 잠시 떴다가 사라지는 것을 볼 수 있다. 문자가 전송된 후 <발신함에저장하시겠습니까>라는 메세지와 <예>, <아니오> 를 사용자로 부터 입력 받는 버튼 영역이 있다. DialogComponent는 이렇게 필요에 의해 창을 보여주거나 사용자에게 입력을 받아야 할 때 사용되는 컴포넌트이다.
DialogComponent는 세가지 타입이 있다.
TYPE_NONE의 경우에는 디폴트로 3초간 창이 떴다가 사라지는 유형이다. 딜레이 값은 setTimeout메소드를 이용하여 지정할 수 있다.
TYPE_OK의 경우에는 <OK>버튼 만 있는 경우이고,
TYPE_OK_CANCEL은 <OK> 버튼과 <CANCEL> 버튼이 있는 형태의 다이얼로그 타입니다.

DialogComponent는 타이틀 영역, 데이터 영역, 버튼 영역의 세가지 영역으로 구성되어 있으며, 데이터 영역에는 한 개의 컴포넌트만을 추가 할 수 있다. 여러개의 컴포넌트를 가지는 다이얼로그를 만들려면 ContainerComponent를 활용하여 데이터 영역에 추가하면 된다.

DialogComponent 클래스의 주요 생성자
- public DialogComponent(int type)
컴포넌트와 타이틀이 없고 주어진 타입을 가지는 DialogComponent를 생성.
- public DialogComponent(Component c, String title, int type)
  주어진 컴포넌트, 타이틀, 타입으로 DialogComponent를 생성.
- public DialogComponent(Component c, String title, int type, int x, int y, int w, int h)
주어진 컴포넌트, 타이틀, 타입, 그리고 좌표와 크기로 DialogComponent를 생성
DialogComponent 클래스의 주요 필드
- public static final int TYPE_NONE
버튼이 없는 형태의 다이얼로그 타입. 기본 화면 출력 시간은 3초이다.

- public static final int TYPE_OK
OK 버튼만 있는 다이얼로그 타입.

- public static final int TYPE_OK_CANCEL
OK 버튼과 CANCEL 버튼이 있는 다이얼 로그 타입.

- public static final int DLG_TIMEOUT
doModal 시 반환되는 값으로 TIMEOUT되어 종료된 것을 나타냄.

- public static final int DLG_OK
doModal 시 반환되는 값으로 OK 버튼이 선택되었음을 나타냄.

- public static final int DLG_CANCEL
doMadal 시 반환되는 값으로 CANCEL 버튼이 선택되었음을 나타냄.

- public static final int OK_BUTTON
OK 버튼 타입

- public static final int CANCEL_BUTTON
CANCEL 버튼 타입

- public static final int TIMEOUT_INFINITE
TIMEOUT값 중 무한대의 값을 나타냄

- protected int actionState
현재 어떤 이벤트가 발생한 것인지를 기억하는 필드

DialogComponent 클래스의 주요 메소드
- public void setButtonString(int buttonType, String buttonStr)
버튼의 문자를 지정한다.
- public void setType(int type)
DialogComponent의 타입을 지정한다.
- public void setTimeout(int timeout)
DialogComponent를 호면에 보여줄 타임아웃 시간을 설정한다.
- public int doModal()
DialogComponent를 화면에 나타나게 한다.
- public void show()
DialogComponent를 화면에 보여준다.
- public int getActionState()
DialogComponent에서 발생한 마지막 액션을 얻어온다.



메소드 리스트를 보면 화면에 DialogComponent를 화면에 나타나게 하는 두 가지의 메소드가 있는 것을 확인할 수 있다. 하나는 doModal()이고 다른 하나는 ShellComponent로 부터 오버라이드한 show()이다.

doModal()은 DialogComponent를 화면에 나타나게 한다. 이 메소드를 호출하면 다이얼로그가 화면에 출력되며 버튼이나 timeout에 의한 액션이 발생할 경우 화면에서 제거 된다. 이때 발생한 액션 값을 리턴한다. 예를 들어 TYPE_OK_CANCEL 유형을 설정하여 생성된 다이얼로그의 경우 doModal()을 이용할 경우 사용자에게 입력 받을 수 있느 값이 두 개이기 때문에 두 종류의 리턴 값을 가지게 되는데 <OK> 버튼은 DLG_OK, <CANCEL> 버튼은 DLG_CANCEL 값을 리턴 받게 된다.

show()를 사용하여 DialogComponent를 화면에 나타낼 경우에는 사용자의 선택 여부를 알 수 없다. 그러므로 DialogComponent 사용 시 show() 메소드를 이용하는 것 보다 doModal()를 이용하는 것이 더 바람직 하다.

예제를 살펴 보자.
import org.kwis.msp.lcdui.*;
import org.kwis.msp.lwc.*;

public class wipiTest extends Jlet implements ActionListener{
   ShellComponent   sc=    new ShellComponent();
   FormComponent    fc=    new FormComponent();
  
   LabelComponent   lb1=    new LabelComponent("메세지 전송");
   LabelComponent   lb2=    new LabelComponent("메세지 전송 완료");

   TextBoxComponent tb=
         new TextBoxComponent(null, TextBoxComponent.CONSTRAINT_ANY, 80);

   ButtonComponent  btn=    new ButtonComponent("전송하기", null);

   DialogComponent  dc1=
         new DialogComponent(lb1, "문자메세지", DialogComponent.TYPE_NONE);
   DialogComponent dc2=
         new DialogComponent(lb2, "문자메세지", DialogComponent.TYPE_OK);

   public void startApp(String args[]){
       dc1.setTimeout(5000);

       btn.setActionListener(this, null);

       fc.addComponent(tb);
       fc.addComponent(btn);
       fc.setGab(5);

       sc.setTitle("문자 메세지 전송하기");
       sc.addComponent(fc);
       sc.show();

   }

   public void pauseApp(){}
   public void resumeApp(){}
   public void destroyApp(boolean b){}

   public void action(Component c, Object obj){
       if(c==btn){
           dc1.doModal();
           dc2.doModal();

           tb.setString(null);
       }
   }

};

출력 결과는 다음과 같다.