티스토리 뷰

ContainerComponent 클래스를 상속받아 구현한 ShellComponent와 FormComponent는 유사한 점이 많다. 당연히 같은 부모 클래스로 부터 상속을 받았으니 유사한 면도 있을 것이고 다른 성격을 가질 수도 있을 것이다. 그런데 여기서 다른 성격을 가진 이 두 컴포넌트를 굳이 같이 묶어서 설명하려는 이유는 결국 부모인 ContainerComponent의 일을 물려 받았기 때문이다. 즉 ShellComponent 클래스와 FormComponent 클래스는 둘 다 하위의 컴포넌트들을 담는 역할을 한다. 다른 점은 ShellComponent는 단 하나의 자식 컴포넌트를 갖는다는 것이고, FormComponent는 여러 개의 자식 컴포넌트를 갖는다는 것이다.
다음 예를 보면 이해가 쉬울 것이다.

ShellComponent sc=    new ShellComponent();
sc.addComponent(new ButtonComponent("1번 버튼", null));
sc.addComponent(new ButtonComponent("2번 버튼", null)); //에러 발생

FormComponent fc=    new FormComponent();
fc.addComponent(new ButtonComponent("1번 버튼", null));
fc.addComponent(new ButtonComponent("2번 버튼", null)); //에러 발생 하지 않음

즉, ShellComponent의 addComponent()메소드를 두번 이상 호출 하게 되면 IllegalArgumentException이 발생한다.

ShellComponent도 addComponent()메소드가 있고, FormComponent도 addComponent()메소드가 있다. 이것이 바로 오버라이드(override)의 전형적인 예이다. 즉 두 클래스 모두 부모 클래스인 ContainerComponent로 부터 상속을 받았고, ContainerComponent의 addComponent() 메소드를 각각 재정의 한 것이다.

Jlet 응용프로그램 에서 모든 컴포넌트들을 화면에 보여주기 위해서는 ShellComponent 클래스를 사용해야 한다. 그렇다면 한 개의 컴포넌트 밖에 추가시킬 수 없는 ShellComponent 클래스를 이용해 어떻게 여러개의 컴포넌트들을 표시할 수 있을까. 바로 FormComponent에 여러개의 컴포넌트를 올린 뒤 마지막에 ShellComponent에 add시키면 될 것이다.

실제로 프로그래밍을 해 보자

import org.kwis.msp.lcdui.*;
import org.kwis.msp.lwc.*;

public class wipiTest extends Jlet{
  public void startApp(String args[]){
       ShellComponent    sc=    new ShellComponent();
       FormComponent     fc=    new FormComponent();

       fc.addComponent(new LabelComponent("첫번째 라벨 컴포넌트"));
       fc.addComponent(new LabelComponent("두번째 라벨 컴포넌트"));

       sc.addComponent(fc);
       sc.show();
  }

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

};

출력 결과는 다음과 같다.




1. ShellComponent

ShellComponent 클래스의 주요 생성자

- public ShellComponent()
화면 크기의 ShellComponent를 생성한다.

- public ShellComponent(int x, int y, int w, int h)
지정한 크기로 ShellComponent를 생성한다.

- public ShellComponent(int x, int y, int w, int h, boolean b)
지정한 크기의 ShellComponent를 생성하며, b에 따라 투명의 여부가 결정된다.

ShellComponent 클래스의 주요 메소드

- public void layout()
하위 컴포넌트의 크기와 위치를 결정한다.

- public void repaint(int x, int y, int w, int h)
화면의 내용을 갱신할 필요가 있을 때 부른다.

- public void show()
컴포넌트를 화면상에 보여준다.
- public void hide()
컴포넌트를 감춘다.
- public boolean isShown()
현재 컴포넌트가 보이는지 안 보이는지의 여부를 돌려준다.
- public void configure(int x, int y, int w, int h, int mask)
컴포넌트의 위치나 크기를 변경한다.
- public int getX()
컴포넌트의 x좌표를 돌려준다.
- public int getY()
컴포넌트의 y좌표를 돌려준다.
- public void showNotify(boolean b)
화면의 내용이 보이면 호출된다.
- public void serviceRepaints()
갱신된 내용을 즉시 화면에 출력해 준다.
- public void addComponent(int index, Component c)
지정한 위치에 c컴포넌트를 추가한다.
- public void addComponent(Component c)
c컴포넌트를 추가한다.
- protected boolean processEvent(int type, int subtype, int param1, int param2)
이벤트를 처리한다.

- public void setTitle(Component c)
타이틀을 지정한다.

- public Component getWorkComponent()
지정한 컴포넌트를 돌려준다.
- public void setWorkComponent(Component c)
컴포넌트를 설정한다.

- public void removeComponent(Component c)
지정한 컴포넌트를 삭제한다.

- public void setCommand(Component c, boolean b)
커멘드를 지정한다.
- public void setTitle(String str)
타이틀 문자열을 지정한다.
- public Card getCard()
현재 컴포넌트에 연결된 카드를 돌려준다.
- public void grabKey(int key)
특정 키코드를 그랩하여 GrabKeyListener에게 보낸다.
- public void setGrabKeyListener(GrabKeyListener listener, Object obj)
GrabKeyListener을 등록한다.
- protected boolean keyNotify(int type, int chr)
키 입력을 받으면 호출된다.
- protected void controlInset(boolean b)
ContainerComponent에서 사용할 테두리의 두께 값을 제어한다.


ShellComponent에 컴포넌트를 등록할 수 있는 메소드는 두 가지가 있다. 하나는 addComponent()이고 다른 하나는 setWorkComponent()이다. 둘 중 어느 것을 사용해도 상관없다.
프로그램 예제를 보자.

import org.kwis.msp.lcdui.*;
import org.kwis.msp.lwc.*;

public class wipiTest extends Jlet{
  public void startApp(String args[]){
       compo();
  }

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

  public void compo(){
       ShellComponent sc=    new ShellComponent();

       sc.setTitle(new LabelComponent("타이틀 컴포넌트"));
       sc.addComponent(new ButtonComponent("작업 컴포넌트", null));
       sc.setCommand(new LabelComponent("커맨트 컴포넌트"), false);
      
       sc.show();
  }
};

출력은 다음과 같다.





2. FormComponent

여러 개의 GUI 컴포넌트를 화면에 나타내려 할 때 필요한 컴포넌트이다. 여러개를 관리하다 보니 각 컴포넌트의 배치와 스크롤 여부도 관리한다. 내부 컴포넌트가 많으면 자동으로 스크롤이 생긴다. 부착되는 컴포넌트를 수직 정렬시킬 것인지 수평 정렬 시킬 것인지가 관심사일 것이다. 그것은 FormComponent를 생성할 때 인자값에 의해 결정되며 디폴트로 수평 정렬이다. FormComponent()를 생성하면 수평으로 정렬되며, FormComponent(false)로 선언하면 수직으로 정렬된다.

import org.kwis.msp.lcdui.*;
import org.kwis.msp.lwc.*;

public class wipiTest extends Jlet{
  public void startApp(String args[]){
       ShellComponent sc=    new ShellComponent();

       FormComponent fc=     new FormComponent();
       FormComponent fc1=    new FormComponent();
       FormComponent fc2=    new FormComponent(false); //컴포넌트가 가로로 추가된다.

       fc1.addComponent(new LabelComponent("첫번째 라벨"));
       fc1.addComponent(new LabelComponent("두번째 라벨"));
       fc1.setGab(10);

       fc2.addComponent(new ButtonComponent("확인", null));
       fc2.addComponent(new ButtonComponent("취소", null));
       fc2.setGab(30);

       fc.addComponent(fc1);
       fc.addComponent(fc2);

       sc.addComponent(fc);
       sc.show();
  }

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

};

출력결과는 다음과 같다.


댓글
Total
149,286
Today
6
Yesterday
100